aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2016-06-17 17:37:30 -0400
committerRobert Haas <rhaas@postgresql.org>2016-06-17 17:37:30 -0400
commit71d05a2c7b82379bb1013a0e338906349c54ed85 (patch)
tree53a862320e1b58955449b7238d6f725cf1d954b4 /src
parent54f5c5150fa05d7ad15f8406debd5a2b394885b5 (diff)
downloadpostgresql-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.c3
-rw-r--r--src/backend/catalog/storage.c16
-rw-r--r--src/include/access/xlog_internal.h2
-rw-r--r--src/include/catalog/storage_xlog.h8
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);