]> granicus.if.org Git - postgresql/commitdiff
Distinguish XLOG_FPI records generated for hint-bit updates.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 24 Nov 2014 08:43:32 +0000 (10:43 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 24 Nov 2014 09:09:08 +0000 (11:09 +0200)
Add a new XLOG_FPI_FOR_HINT record type, and use that for full-page images
generated for hint bit updates, when checksums are enabled. The new record
type is replayed exactly the same as XLOG_FPI, but allows them to be tallied
separately e.g. in pg_xlogdump.

src/backend/access/rmgrdesc/xlogdesc.c
src/backend/access/transam/xlog.c
src/backend/access/transam/xloginsert.c
src/backend/replication/logical/decode.c
src/include/catalog/pg_control.h

index 4088ba99b7ffcb8a58245338ac31e8d3ac1bdab5..eba046d1fa9fe51fbc9ee0f8bc47429a4f621249 100644 (file)
@@ -74,7 +74,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
 
                appendStringInfo(buf, "%s", xlrec->rp_name);
        }
-       else if (info == XLOG_FPI)
+       else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT)
        {
                /* no further information to print */
        }
@@ -170,6 +170,9 @@ xlog_identify(uint8 info)
                case XLOG_FPI:
                        id = "FPI";
                        break;
+               case XLOG_FPI_FOR_HINT:
+                       id = "FPI_FOR_HINT";
+                       break;
        }
 
        return id;
index 2059bbeda4aad2c70d3574157845f7216c2fc2c9..8e712b793f33db6591ef36c79fd10ea8785d69b1 100644 (file)
@@ -8545,7 +8545,8 @@ xlog_redo(XLogReaderState *record)
        XLogRecPtr      lsn = record->EndRecPtr;
 
        /* in XLOG rmgr, backup blocks are only used by XLOG_FPI records */
-       Assert(!XLogRecHasAnyBlockRefs(record) || info == XLOG_FPI);
+       Assert(info == XLOG_FPI || info == XLOG_FPI_FOR_HINT ||
+                  !XLogRecHasAnyBlockRefs(record));
 
        if (info == XLOG_NEXTOID)
        {
@@ -8730,7 +8731,7 @@ xlog_redo(XLogReaderState *record)
        {
                /* nothing to do here */
        }
-       else if (info == XLOG_FPI)
+       else if (info == XLOG_FPI || info == XLOG_FPI_FOR_HINT)
        {
                Buffer          buffer;
 
@@ -8739,12 +8740,15 @@ xlog_redo(XLogReaderState *record)
                 * block. The block reference must include a full-page image -
                 * otherwise there would be no point in this record.
                 *
-                * Since the only change in these backup block are hint bits, there
-                * are no recovery conflicts generated.
+                * No recovery conflicts are generated by these generic records - if a
+                * resource manager needs to generate conflicts, it has to define a
+                * separate WAL record type and redo routine.
                 *
-                * This also means there is no corresponding API call for this, so an
-                * smgr implementation has no need to implement anything. Which means
-                * nothing is needed in md.c etc
+                * XLOG_FPI_FOR_HINT records are generated when a page needs to be
+                * WAL- logged because of a hint bit update. They are only generated
+                * when checksums are enabled. There is no difference in handling
+                * XLOG_FPI and XLOG_FPI_FOR_HINT records, they use a different info
+                * code just to distinguish them for statistics purposes.
                 */
                if (XLogReadBufferForRedo(record, 0, &buffer) != BLK_RESTORED)
                        elog(ERROR, "unexpected XLogReadBufferForRedo result when restoring backup block");
index fe2043130241b041b64372f38b08eb567b79b53b..34e44e4f235a7b5f30e4168c3e5366246fe0060a 100644 (file)
@@ -786,7 +786,7 @@ XLogSaveBufferForHint(Buffer buffer, bool buffer_std)
                BufferGetTag(buffer, &rnode, &forkno, &blkno);
                XLogRegisterBlock(0, &rnode, forkno, blkno, copied_buffer, flags);
 
-               recptr = XLogInsert(RM_XLOG_ID, XLOG_FPI);
+               recptr = XLogInsert(RM_XLOG_ID, XLOG_FPI_FOR_HINT);
        }
 
        return recptr;
index 1c7dac38fc99eb43e7d6cf974f75c466a6019432..4e81322509f9c0aefb9cf8f4c9aa3a7a1e57c5c0 100644 (file)
@@ -170,6 +170,7 @@ DecodeXLogOp(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
                case XLOG_PARAMETER_CHANGE:
                case XLOG_RESTORE_POINT:
                case XLOG_FPW_CHANGE:
+               case XLOG_FPI_FOR_HINT:
                case XLOG_FPI:
                        break;
                default:
index ba79d253ae5ff587bfb2afec4624e5bd99a7c93c..15f81e4a44d432e69cec2ce10a67438d2c0f6ce3 100644 (file)
@@ -67,7 +67,8 @@ typedef struct CheckPoint
 #define XLOG_RESTORE_POINT                             0x70
 #define XLOG_FPW_CHANGE                                        0x80
 #define XLOG_END_OF_RECOVERY                   0x90
-#define XLOG_FPI                                               0xA0
+#define XLOG_FPI_FOR_HINT                              0xA0
+#define XLOG_FPI                                               0xB0
 
 
 /*