Add XLR_SPECIAL_REL_UPDATES flag
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 6 Nov 2014 12:40:04 +0000 (14:40 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 10 Nov 2014 19:24:36 +0000 (21:24 +0200)
src/backend/access/transam/xloginsert.c
src/backend/catalog/storage.c
src/backend/commands/dbcommands.c
src/include/access/xlogrecord.h

index bde40df27f1750c9d18d1d3c1a9a96faa4a07e1e..efc161ba9d0fb46500f2f0cf005886e19bf95065 100644 (file)
@@ -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);
index 2c6b5f275871aa843fc5748e04c902cc30487d41..19b97644b8e4785b14d1900221394ac81ef63cc5 100644 (file)
@@ -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
index 4546bebf28d874c5ee1905044774e0bdca94a285..8fe12f737d0bd6fbc9e941d6c44b5a5189e31a27 100644 (file)
@@ -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);
index b1e04214196403f207b3eb324b84b68e8b9a8112..ba00b4eaba891385df6ea11d4f4a9278843fdde4 100644 (file)
@@ -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.
  *