From e53b078d88ada9881bfdb458472a7457e0d1323d Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Thu, 12 Mar 2026 18:33:02 +0100 Subject: [PATCH v20260330 1/2] Add proper WAL record for XLOG_CHECKPOINT_REDO 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 Discussion: https://postgr.es/m/.. --- src/backend/access/rmgrdesc/xlogdesc.c | 6 +++--- src/backend/access/transam/xlog.c | 8 +++++++- src/backend/postmaster/walsummarizer.c | 5 ++++- src/include/access/xlog_internal.h | 6 ++++++ src/tools/pgindent/typedefs.list | 1 + 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index 9044b952117..44194d3ea17 100644 --- a/src/backend/access/rmgrdesc/xlogdesc.c +++ b/src/backend/access/rmgrdesc/xlogdesc.c @@ -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) { diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index f5c9a34374d..2c1c6f88b74 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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); /* diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c index 0c0670f7da9..a37b3018abf 100644 --- a/src/backend/postmaster/walsummarizer.c +++ b/src/backend/postmaster/walsummarizer.c @@ -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) { diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index 1730b07810f..755835d63bf 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -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. diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index e3c1007abdf..48c6ae6b0bc 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -4398,6 +4398,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 -- 2.39.3 (Apple Git-146)