From e51c46991f0ee99cca222305619dee5543a1290a Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 16 Nov 2021 09:43:17 -0500 Subject: [PATCH] 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. Patch by me. Reviewed by Nathan Bossart and Michael Paquier. Discussion: http://postgr.es/m/CA+TgmoY7b65qRjzHN_tWUk8B4sJqk1vj1d31uepVzmgPnZKeLg@mail.gmail.com --- 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 e073121a7e7..355d1737c39 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 78bc64671ec..0c56c38a141 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(); }