mirror of
https://github.com/postgres/postgres.git
synced 2025-08-08 06:02:22 +03:00
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.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user