From cce396cd998a047196d3c18575a282c6d5463741 Mon Sep 17 00:00:00 2001 From: Yanan Xin Date: Fri, 5 Dec 2025 22:59:55 +0000 Subject: [PATCH 1/2] [LKB-5974][PG_18] Add the ability to reduce FPI --- src/backend/access/transam/xlog.c | 7 ++++++- src/backend/access/transam/xloginsert.c | 26 ++++++++++++++++++++++++- src/include/access/xloginsert.h | 10 ++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 1df98824f98..eff5d4c5fa2 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -863,6 +863,10 @@ XLogInsertRecord(XLogRecData *rdata, * our local copy but not force a recomputation. (If doPageWrites was * just turned off, we could recompute the record without full pages, * but we choose not to bother.) + * + * However, if suppress_fpi is true, we skip the recomputation check + * since we're deliberately suppressing full page images for this + * record via the FPI control hook. */ if (RedoRecPtr != Insert->RedoRecPtr) { @@ -873,7 +877,8 @@ XLogInsertRecord(XLogRecData *rdata, if (doPageWrites && (!prevDoPageWrites || - (fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr))) + (!suppress_fpi && + fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr))) { /* * Oops, some buffer now needs to be backed up that the caller diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index ecc16ae79fd..28e2ced6f6d 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -94,6 +94,12 @@ int max_replication_apply_lag; int max_replication_flush_lag; int max_replication_write_lag; +/* NEON: Hook to determine if FPI should be suppressed for a WAL record */ +xlog_should_suppress_fpi_hook_type xlog_should_suppress_fpi_hook = NULL; + +/* NEON: Global flag to suppress FPI for current WAL record */ +bool suppress_fpi = false; + static registered_buffer *registered_buffers; static int max_registered_buffers; /* allocated size */ static int max_registered_block_id = 0; /* highest block_id + 1 currently @@ -530,6 +536,16 @@ XLogInsert(RmgrId rmid, uint8 info) */ GetFullPageWriteInfo(&RedoRecPtr, &doPageWrites); + /* + * NEON: Check if we should suppress FPI for this WAL record. + */ + suppress_fpi = false; + if (xlog_should_suppress_fpi_hook != NULL) { + suppress_fpi = xlog_should_suppress_fpi_hook(); + elog(DEBUG1, "FPI suppress hook called: suppress_fpi=%d, doPageWrites=%d", + suppress_fpi, doPageWrites); + } + rdt = XLogRecordAssemble(rmid, info, RedoRecPtr, doPageWrites, &fpw_lsn, &num_fpi, &topxid_included); @@ -630,9 +646,17 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, */ XLogRecPtr page_lsn = PageGetLSN(regbuf->page); - needs_backup = (page_lsn <= RedoRecPtr); + if (suppress_fpi) + needs_backup = false; + else + needs_backup = (page_lsn <= RedoRecPtr); + if (!needs_backup) { + /* + * Set fpw_lsn to signal that this record should be + * recomputed if doPageWrites changes. + */ if (*fpw_lsn == InvalidXLogRecPtr || page_lsn < *fpw_lsn) *fpw_lsn = page_lsn; } diff --git a/src/include/access/xloginsert.h b/src/include/access/xloginsert.h index 43340653e0f..1a0b529ac42 100644 --- a/src/include/access/xloginsert.h +++ b/src/include/access/xloginsert.h @@ -44,6 +44,16 @@ extern int max_replication_apply_lag; extern int max_replication_flush_lag; extern int max_replication_write_lag; +/* NEON: Hook to determine if FPI should be suppressed for a WAL record + * Returns true to suppress FPI, false to allow FPI + * Applies to all resource managers for checkpoint-based FPI triggers. + */ +typedef bool (*xlog_should_suppress_fpi_hook_type)(void); +extern PGDLLIMPORT xlog_should_suppress_fpi_hook_type xlog_should_suppress_fpi_hook; + +/* NEON: Flag set per-record to suppress FPI (set by xlog_should_suppress_fpi_hook) */ +extern bool suppress_fpi; + /* prototypes for public functions in xloginsert.c: */ extern void XLogBeginInsert(void); extern void XLogSetRecordFlags(uint8 flags); From f8dca5bcffa67d0bc9a6bcaf3f5d056006fc76ce Mon Sep 17 00:00:00 2001 From: Yanan Xin Date: Mon, 8 Dec 2025 19:00:15 +0000 Subject: [PATCH 2/2] review comments, simplify code --- src/backend/access/transam/xloginsert.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 28e2ced6f6d..70e871d335c 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -635,7 +635,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, needs_backup = true; else if (regbuf->flags & REGBUF_NO_IMAGE) needs_backup = false; - else if (!doPageWrites) + else if (!doPageWrites || suppress_fpi) needs_backup = false; else { @@ -646,10 +646,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, */ XLogRecPtr page_lsn = PageGetLSN(regbuf->page); - if (suppress_fpi) - needs_backup = false; - else - needs_backup = (page_lsn <= RedoRecPtr); + needs_backup = (page_lsn <= RedoRecPtr); if (!needs_backup) {