From a104cfdfea2571a0a3a6930f97945c6948278dbd Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 8 Nov 2021 16:35:30 -0500 Subject: [PATCH v2 1/2] Move InitXLogInsert() call from InitXLOGAccess() to BaseInit(). At present, there is an undocumented coding rule that you must call RecoveryInProgress(), or do something else that results in a call to InitXLogInsert(), before trying to write WAL. Otherwise, the WAL construction buffers won't be initialized, resulting in failures. Since it's not good to rely on a status inquiry function like RecoveryInProgress() having the side effect of initializing critical data structures, instead do the initialization eariler, when the backend first starts up. --- src/backend/access/transam/xlog.c | 13 ------------- src/backend/utils/init/postinit.c | 6 ++++++ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index e073121a7e..355d1737c3 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -8677,9 +8677,6 @@ InitXLOGAccess(void) (void) GetRedoRecPtr(); /* Also update our copy of doPageWrites. */ doPageWrites = (Insert->fullPageWrites || Insert->forcePageWrites); - - /* Also initialize the working areas for constructing WAL records */ - InitXLogInsert(); } /* @@ -9129,16 +9126,6 @@ CreateCheckPoint(int flags) if (RecoveryInProgress() && (flags & CHECKPOINT_END_OF_RECOVERY) == 0) elog(ERROR, "can't create a checkpoint during recovery"); - /* - * Initialize InitXLogInsert working areas before entering the critical - * section. Normally, this is done by the first call to - * RecoveryInProgress() or LocalSetXLogInsertAllowed(), but when creating - * an end-of-recovery checkpoint, the LocalSetXLogInsertAllowed call is - * done below in a critical section, and InitXLogInsert cannot be called - * in a critical section. - */ - InitXLogInsert(); - /* * Prepare to accumulate statistics. * diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 78bc64671e..0c56c38a14 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -541,6 +541,12 @@ BaseInit(void) * file shutdown hook can report temporary file statistics. */ InitTemporaryFileAccess(); + + /* + * Initialize local buffers for WAL record construction, in case we + * ever try to insert XLOG. + */ + InitXLogInsert(); } -- 2.24.3 (Apple Git-128)