From: Heikki Linnakangas Date: Thu, 6 Nov 2014 12:40:04 +0000 (+0200) Subject: Add XLR_SPECIAL_REL_UPDATES flag X-Git-Url: http://git.postgresql.org/gitweb/review?a=commitdiff_plain;h=f59201d2966f62108682fe31bbdd5a0ab77e5354;p=users%2Fheikki%2Fpostgres.git Add XLR_SPECIAL_REL_UPDATES flag --- diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index bde40df27f..efc161ba9d 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -339,8 +339,11 @@ XLogInsert(RmgrId rmid, uint8 info) if (!begininsert_called) elog(ERROR, "XLogBeginInsert was not called"); - /* info's high bits are reserved for use by me */ - if (info & XLR_INFO_MASK) + /* + * The caller can set rmgr bits and XLR_SPECIAL_REL_UPDATE; the rest + * are reserved for use by me. + */ + if ((info & ~(XLR_RMGR_INFO_MASK | XLR_SPECIAL_REL_UPDATE)) != 0) elog(PANIC, "invalid xlog info mask %02X", info); TRACE_POSTGRESQL_XLOG_INSERT(rmid, info); diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 2c6b5f2758..19b97644b8 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -134,7 +134,7 @@ log_smgrcreate(RelFileNode *rnode, ForkNumber forkNum) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - XLogInsert(RM_SMGR_ID, XLOG_SMGR_CREATE); + XLogInsert(RM_SMGR_ID, XLOG_SMGR_CREATE | XLR_SPECIAL_REL_UPDATE); } /* @@ -272,7 +272,8 @@ RelationTruncate(Relation rel, BlockNumber nblocks) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - lsn = XLogInsert(RM_SMGR_ID, XLOG_SMGR_TRUNCATE); + lsn = XLogInsert(RM_SMGR_ID, + XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE); /* * Flush, because otherwise the truncation of the main relation might diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 4546bebf28..8fe12f737d 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -629,7 +629,8 @@ createdb(const CreatedbStmt *stmt) XLogRegisterData((char *) &xlrec, sizeof(xl_dbase_create_rec)); - (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE); + (void) XLogInsert(RM_DBASE_ID, + XLOG_DBASE_CREATE | XLR_SPECIAL_REL_UPDATE); } } heap_endscan(scan); @@ -1233,7 +1234,8 @@ movedb(const char *dbname, const char *tblspcname) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xl_dbase_create_rec)); - (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE); + (void) XLogInsert(RM_DBASE_ID, + XLOG_DBASE_CREATE | XLR_SPECIAL_REL_UPDATE); } /* @@ -1332,7 +1334,8 @@ movedb(const char *dbname, const char *tblspcname) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xl_dbase_drop_rec)); - (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_DROP); + (void) XLogInsert(RM_DBASE_ID, + XLOG_DBASE_DROP | XLR_SPECIAL_REL_UPDATE); } /* Now it's safe to release the database lock */ @@ -1869,7 +1872,8 @@ remove_dbtablespaces(Oid db_id) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xl_dbase_drop_rec)); - (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_DROP); + (void) XLogInsert(RM_DBASE_ID, + XLOG_DBASE_DROP | XLR_SPECIAL_REL_UPDATE); } pfree(dstpath); diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h index b1e0421419..ba00b4eaba 100644 --- a/src/include/access/xlogrecord.h +++ b/src/include/access/xlogrecord.h @@ -58,17 +58,28 @@ typedef struct XLogRecord #define SizeOfXLogRecord MAXALIGN(sizeof(XLogRecord)) /* - * XLOG uses only low 4 bits of xl_info. High 4 bits may be used by rmgr. + * The high 4 bits in xl_info may be used freely by rmgr. The + * XLR_SPECIAL_REL_UPDATE bit can be passed by XLogInsert caller. The rest + * are set internally by XLogInsert. */ #define XLR_INFO_MASK 0x0F #define XLR_RMGR_INFO_MASK 0xF0 +/* + * If a WAL record modifies any relation files, in ways not covered by the + * usual block references, this flag is set. This is not used for anything + * by PostgreSQL itself, but it allows external tools that read WAL and keep + * track of modified blocks to recognize such special record types. + */ +#define XLR_SPECIAL_REL_UPDATE 0x01 + /* * xl_len == 0 is only allowed if this flag is set. This provides an extra * cross-check when reading records. */ #define XLR_NO_RMGR_DATA 0x02 + /* * Header info for block data appended to an XLOG record. *