]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Formalize WAL record for XLOG_CHECKPOINT_REDO
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 31 Mar 2026 07:38:01 +0000 (09:38 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 31 Mar 2026 07:38:01 +0000 (09:38 +0200)
XLOG_CHECKPOINT_REDO only contains the wal_level copied straight in
without an encapsulating record structure. While it works, it makes
future uses of XLOG_CHECKPOINT_REDO hard as there is nowhere to put
new data items.  This fix this was inspired by the online checksums
patch which adds data to this record,  but this change has value on
its own.

Author: Daniel Gustafsson <daniel@yesql.se>
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://postgr.es/m/c92b5d8b-bc03-47bc-b209-2e4a719eee32@iki.fi

src/backend/access/rmgrdesc/xlogdesc.c
src/backend/access/transam/xlog.c
src/backend/postmaster/walsummarizer.c
src/include/access/xlog_internal.h
src/tools/pgindent/typedefs.list

index 9044b952117318da57cae9f39fc08cb2c47d894e..44194d3ea17ad7ee9d0373f5d02ca2c7ae817995 100644 (file)
@@ -163,10 +163,10 @@ xlog_desc(StringInfo buf, XLogReaderState *record)
        }
        else if (info == XLOG_CHECKPOINT_REDO)
        {
-               int                     wal_level;
+               xl_checkpoint_redo xlrec;
 
-               memcpy(&wal_level, rec, sizeof(int));
-               appendStringInfo(buf, "wal_level %s", get_wal_level_string(wal_level));
+               memcpy(&xlrec, rec, sizeof(xl_checkpoint_redo));
+               appendStringInfo(buf, "wal_level %s", get_wal_level_string(xlrec.wal_level));
        }
        else if (info == XLOG_LOGICAL_DECODING_STATUS_CHANGE)
        {
index f5c9a34374dde4931779c3d2ed229b4230f7e3b3..2c1c6f88b743ca686ab6e464bf1de257e3ed951e 100644 (file)
@@ -7179,9 +7179,15 @@ CreateCheckPoint(int flags)
         */
        if (!shutdown)
        {
+               xl_checkpoint_redo redo_rec;
+
+               WALInsertLockAcquire();
+               redo_rec.wal_level = wal_level;
+               WALInsertLockRelease();
+
                /* Include WAL level in record for WAL summarizer's benefit. */
                XLogBeginInsert();
-               XLogRegisterData(&wal_level, sizeof(wal_level));
+               XLogRegisterData(&redo_rec, sizeof(xl_checkpoint_redo));
                (void) XLogInsert(RM_XLOG_ID, XLOG_CHECKPOINT_REDO);
 
                /*
index 0c0670f7da9640a5524669d1f8ea50ace7fe99a9..a37b3018abf5cb23e8e7da6c7007857213a33929 100644 (file)
@@ -1435,8 +1435,11 @@ SummarizeXlogRecord(XLogReaderState *xlogreader, bool *new_fast_forward)
 
        if (info == XLOG_CHECKPOINT_REDO)
        {
+               xl_checkpoint_redo xlrec;
+
                /* Payload is wal_level at the time record was written. */
-               memcpy(&record_wal_level, XLogRecGetData(xlogreader), sizeof(int));
+               memcpy(&xlrec, XLogRecGetData(xlogreader), sizeof(xl_checkpoint_redo));
+               record_wal_level = xlrec.wal_level;
        }
        else if (info == XLOG_CHECKPOINT_SHUTDOWN)
        {
index 1730b07810f5a3ebf067ee521c28db4054559433..755835d63bffd6a24177d09517a108a1b47ceb1a 100644 (file)
@@ -303,6 +303,12 @@ typedef struct xl_end_of_recovery
        int                     wal_level;
 } xl_end_of_recovery;
 
+/* checkpoint redo */
+typedef struct xl_checkpoint_redo
+{
+       int                     wal_level;
+} xl_checkpoint_redo;
+
 /*
  * The functions in xloginsert.c construct a chain of XLogRecData structs
  * to represent the final WAL record.
index 3ca68d355d9ad66ebfd0edd7824dbf7a29326f59..c9da1f91cb92aadfa99676e33da92f7ca9446223 100644 (file)
@@ -4397,6 +4397,7 @@ xl_btree_split
 xl_btree_unlink_page
 xl_btree_update
 xl_btree_vacuum
+xl_checkpoint_redo
 xl_clog_truncate
 xl_commit_ts_truncate
 xl_dbase_create_file_copy_rec