v20260313-0001-Add-proper-WAL-record-for-XLOG_CHECKPOINT_.patch
application/octet-stream
Filename: v20260313-0001-Add-proper-WAL-record-for-XLOG_CHECKPOINT_.patch
Type: application/octet-stream
Part: 1
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v20260313-0001
Subject: Add proper WAL record for XLOG_CHECKPOINT_REDO
| File | + | − |
|---|---|---|
| src/backend/access/rmgrdesc/xlogdesc.c | 3 | 3 |
| src/backend/access/transam/xlog.c | 7 | 1 |
| src/backend/postmaster/walsummarizer.c | 4 | 1 |
| src/include/access/xlog_internal.h | 6 | 0 |
| src/tools/pgindent/typedefs.list | 1 | 0 |
From 99cf6fb7f3b8e5fcbbb387590b4478783135f3ce Mon Sep 17 00:00:00 2001
From: Daniel Gustafsson <dgustafsson@postgresql.org>
Date: Thu, 12 Mar 2026 18:33:02 +0100
Subject: [PATCH v20260313 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 <daniel@yesql.se>
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 ff078f22264..6b72708d402 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 b9b678f3722..3f383ddcf7c 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 e1aa102f41d..bdc2236a8c1 100644
--- a/src/backend/postmaster/walsummarizer.c
+++ b/src/backend/postmaster/walsummarizer.c
@@ -1428,8 +1428,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 58ae12bb20f..16642933af2 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 0de55183793..ee77413c207 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -4366,6 +4366,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)