From 17e84c9454edb4b1be3973ef97cfca759849f2a3 Mon Sep 17 00:00:00 2001 From: Yanan Xin Date: Fri, 21 Nov 2025 23:10:41 +0000 Subject: [PATCH 1/3] [LKB-5974][PG_16]Add the ability to reduce FPI --- src/backend/access/transam/xlog.c | 3 ++- src/backend/access/transam/xloginsert.c | 26 ++++++++++++++++++++++++- src/include/access/xloginsert.h | 11 +++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 81183e2ec6b..9f854432bdc 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -848,7 +848,8 @@ XLogInsertRecord(XLogRecData *rdata, if (doPageWrites && (!prevDoPageWrites || - (fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr))) + (!force_disable_full_page_write && + fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr))) { /* * Oops, some buffer now needs to be backed up that the caller didn't diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 1fc2159b193..a44538e1590 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 control Full Page Image (FPI) writes */ +xlog_fpi_control_hook_type xlog_fpi_control_hook = NULL; + +/* NEON: Global flag to force disable FPI for current WAL record */ +bool force_disable_full_page_write = 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 @@ -516,6 +522,16 @@ XLogInsert(RmgrId rmid, uint8 info) */ GetFullPageWriteInfo(&RedoRecPtr, &doPageWrites); + /* + * NEON: Check if we should force disable FPI for this WAL record. + */ + force_disable_full_page_write = false; + if (xlog_fpi_control_hook != NULL) { + force_disable_full_page_write = xlog_fpi_control_hook(rmid); + elog(DEBUG1, "FPI control hook called: rmid=%u, force_disable=%d, doPageWrites=%d", + rmid, force_disable_full_page_write, doPageWrites); + } + rdt = XLogRecordAssemble(rmid, info, RedoRecPtr, doPageWrites, &fpw_lsn, &num_fpi, &topxid_included); @@ -616,9 +632,17 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, */ XLogRecPtr page_lsn = PageGetLSN(regbuf->page); - needs_backup = (page_lsn <= RedoRecPtr); + if (force_disable_full_page_write) + 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 e29c27345ce..9b4609a92bf 100644 --- a/src/include/access/xloginsert.h +++ b/src/include/access/xloginsert.h @@ -42,6 +42,17 @@ extern int max_replication_apply_lag; extern int max_replication_flush_lag; extern int max_replication_write_lag; +/* NEON: Hook to control Full Page Image (FPI) writes + * Returns true to DISABLE FPI, false to keep FPI enabled + * Parameters: + * rmid - Resource manager ID (e.g., RM_HEAP_ID, RM_BTREE_ID) + */ + typedef bool (*xlog_fpi_control_hook_type)(RmgrId rmid); + extern PGDLLIMPORT xlog_fpi_control_hook_type xlog_fpi_control_hook; + + /* NEON: Flag set per-record to force disable FPI (set by neon_should_disable_fpi hook) */ + extern bool force_disable_full_page_write; + /* prototypes for public functions in xloginsert.c: */ extern void XLogBeginInsert(void); extern void XLogSetRecordFlags(uint8 flags); From 5a70145b9d9e6a216c2e87e31ce078c63212ee60 Mon Sep 17 00:00:00 2001 From: Yanan Xin Date: Fri, 5 Dec 2025 22:36:09 +0000 Subject: [PATCH 2/3] review comments --- src/backend/access/transam/xlog.c | 8 ++++++-- src/backend/access/transam/xloginsert.c | 24 ++++++++++++------------ src/include/access/xloginsert.h | 17 ++++++++--------- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 9f854432bdc..4f3fb5c90d0 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -838,6 +838,10 @@ XLogInsertRecord(XLogRecData *rdata, * 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) { @@ -848,8 +852,8 @@ XLogInsertRecord(XLogRecData *rdata, if (doPageWrites && (!prevDoPageWrites || - (!force_disable_full_page_write && - 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 didn't diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index a44538e1590..b4f5d72fe0c 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -94,11 +94,11 @@ int max_replication_apply_lag; int max_replication_flush_lag; int max_replication_write_lag; -/* NEON: Hook to control Full Page Image (FPI) writes */ -xlog_fpi_control_hook_type xlog_fpi_control_hook = NULL; +/* 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 force disable FPI for current WAL record */ -bool force_disable_full_page_write = false; +/* 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 */ @@ -523,14 +523,14 @@ XLogInsert(RmgrId rmid, uint8 info) GetFullPageWriteInfo(&RedoRecPtr, &doPageWrites); /* - * NEON: Check if we should force disable FPI for this WAL record. + * NEON: Check if we should suppress FPI for this WAL record. */ - force_disable_full_page_write = false; - if (xlog_fpi_control_hook != NULL) { - force_disable_full_page_write = xlog_fpi_control_hook(rmid); - elog(DEBUG1, "FPI control hook called: rmid=%u, force_disable=%d, doPageWrites=%d", - rmid, force_disable_full_page_write, doPageWrites); - } + 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); @@ -632,7 +632,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, */ XLogRecPtr page_lsn = PageGetLSN(regbuf->page); - if (force_disable_full_page_write) + if (suppress_fpi) needs_backup = false; else needs_backup = (page_lsn <= RedoRecPtr); diff --git a/src/include/access/xloginsert.h b/src/include/access/xloginsert.h index 9b4609a92bf..92503116b8d 100644 --- a/src/include/access/xloginsert.h +++ b/src/include/access/xloginsert.h @@ -42,16 +42,15 @@ extern int max_replication_apply_lag; extern int max_replication_flush_lag; extern int max_replication_write_lag; -/* NEON: Hook to control Full Page Image (FPI) writes - * Returns true to DISABLE FPI, false to keep FPI enabled - * Parameters: - * rmid - Resource manager ID (e.g., RM_HEAP_ID, RM_BTREE_ID) +/* 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_fpi_control_hook_type)(RmgrId rmid); - extern PGDLLIMPORT xlog_fpi_control_hook_type xlog_fpi_control_hook; - - /* NEON: Flag set per-record to force disable FPI (set by neon_should_disable_fpi hook) */ - extern bool force_disable_full_page_write; +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); From c1f2f11d3838ef54032f0b598b5e88d0ed9f0d46 Mon Sep 17 00:00:00 2001 From: Yanan Xin Date: Mon, 8 Dec 2025 18:49:10 +0000 Subject: [PATCH 3/3] review comments --- 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 b4f5d72fe0c..c77acebefd7 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -621,7 +621,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 { @@ -632,10 +632,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) {