diff options
author | Robert Haas <rhaas@postgresql.org> | 2016-06-17 17:37:30 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2016-06-17 17:37:30 -0400 |
commit | 71d05a2c7b82379bb1013a0e338906349c54ed85 (patch) | |
tree | 53a862320e1b58955449b7238d6f725cf1d954b4 /src | |
parent | 54f5c5150fa05d7ad15f8406debd5a2b394885b5 (diff) | |
download | postgresql-71d05a2c7b82379bb1013a0e338906349c54ed85.tar.gz postgresql-71d05a2c7b82379bb1013a0e338906349c54ed85.zip |
pg_visibility: Add pg_truncate_visibility_map function.
This requires some core changes as well so that we can properly
WAL-log the truncation. Specifically, it changes the format of the
XLOG_SMGR_TRUNCATE WAL record, so bump XLOG_PAGE_MAGIC.
Patch by me, reviewed but not fully endorsed by Andres Freund.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/rmgrdesc/smgrdesc.c | 3 | ||||
-rw-r--r-- | src/backend/catalog/storage.c | 16 | ||||
-rw-r--r-- | src/include/access/xlog_internal.h | 2 | ||||
-rw-r--r-- | src/include/catalog/storage_xlog.h | 8 |
4 files changed, 22 insertions, 7 deletions
diff --git a/src/backend/access/rmgrdesc/smgrdesc.c b/src/backend/access/rmgrdesc/smgrdesc.c index 0c6e5832a1c..242d79a1366 100644 --- a/src/backend/access/rmgrdesc/smgrdesc.c +++ b/src/backend/access/rmgrdesc/smgrdesc.c @@ -37,7 +37,8 @@ smgr_desc(StringInfo buf, XLogReaderState *record) xl_smgr_truncate *xlrec = (xl_smgr_truncate *) rec; char *path = relpathperm(xlrec->rnode, MAIN_FORKNUM); - appendStringInfo(buf, "%s to %u blocks", path, xlrec->blkno); + appendStringInfo(buf, "%s to %u blocks flags %d", path, + xlrec->blkno, xlrec->flags); pfree(path); } } diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 67f19063264..0d8311c4038 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -268,6 +268,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) xlrec.blkno = nblocks; xlrec.rnode = rel->rd_node; + xlrec.flags = SMGR_TRUNCATE_ALL; XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xlrec)); @@ -522,17 +523,22 @@ smgr_redo(XLogReaderState *record) */ XLogFlush(lsn); - smgrtruncate(reln, MAIN_FORKNUM, xlrec->blkno); + if ((xlrec->flags & SMGR_TRUNCATE_HEAP) != 0) + { + smgrtruncate(reln, MAIN_FORKNUM, xlrec->blkno); - /* Also tell xlogutils.c about it */ - XLogTruncateRelation(xlrec->rnode, MAIN_FORKNUM, xlrec->blkno); + /* Also tell xlogutils.c about it */ + XLogTruncateRelation(xlrec->rnode, MAIN_FORKNUM, xlrec->blkno); + } /* Truncate FSM and VM too */ rel = CreateFakeRelcacheEntry(xlrec->rnode); - if (smgrexists(reln, FSM_FORKNUM)) + if ((xlrec->flags & SMGR_TRUNCATE_FSM) != 0 && + smgrexists(reln, FSM_FORKNUM)) FreeSpaceMapTruncateRel(rel, xlrec->blkno); - if (smgrexists(reln, VISIBILITYMAP_FORKNUM)) + if ((xlrec->flags & SMGR_TRUNCATE_VM) != 0 && + smgrexists(reln, VISIBILITYMAP_FORKNUM)) visibilitymap_truncate(rel, xlrec->blkno); FreeFakeRelcacheEntry(rel); diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index af2944c1b35..2627519ba08 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -31,7 +31,7 @@ /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD091 /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD092 /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData { diff --git a/src/include/catalog/storage_xlog.h b/src/include/catalog/storage_xlog.h index 7207e8be727..500e663b5fb 100644 --- a/src/include/catalog/storage_xlog.h +++ b/src/include/catalog/storage_xlog.h @@ -36,10 +36,18 @@ typedef struct xl_smgr_create ForkNumber forkNum; } xl_smgr_create; +/* flags for xl_smgr_truncate */ +#define SMGR_TRUNCATE_HEAP 0x0001 +#define SMGR_TRUNCATE_VM 0x0002 +#define SMGR_TRUNCATE_FSM 0x0004 +#define SMGR_TRUNCATE_ALL \ + (SMGR_TRUNCATE_HEAP|SMGR_TRUNCATE_VM|SMGR_TRUNCATE_FSM) + typedef struct xl_smgr_truncate { BlockNumber blkno; RelFileNode rnode; + int flags; } xl_smgr_truncate; extern void log_smgrcreate(RelFileNode *rnode, ForkNumber forkNum); |