Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e315bd7

Browse files
author
Amit Kapila
committed
Fix assertion failure when updating full_page_writes for checkpointer.
When the checkpointer receives a SIGHUP signal to update its configuration, it may need to update the shared memory for full_page_writes and need to write a WAL record for it. Now, it is quite possible that the XLOG machinery has not been initialized by that time and it will lead to assertion failure while doing that. Fix is to allow the initialization of the XLOG machinery outside critical section. This bug has been introduced by the commit 2c03216 which added the XLOG machinery initialization in RecoveryInProgress code path. Reported-by: Dilip Kumar Author: Dilip Kumar Reviewed-by: Michael Paquier and Amit Kapila Backpatch-through: 9.5 Discussion: https://postgr.es/m/CAFiTN-u4BA8KXcQUWDPNgaKAjDXC=C2whnzBM8TAcv=stckYUw@mail.gmail.com
1 parent f4fa92f commit e315bd7

File tree

1 file changed

+9
-1
lines changed
  • src/backend/access/transam

1 file changed

+9
-1
lines changed

src/backend/access/transam/xlog.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9272,6 +9272,7 @@ void
92729272
UpdateFullPageWrites(void)
92739273
{
92749274
XLogCtlInsert *Insert = &XLogCtl->Insert;
9275+
bool recoveryInProgress;
92759276

92769277
/*
92779278
* Do nothing if full_page_writes has not been changed.
@@ -9283,6 +9284,13 @@ UpdateFullPageWrites(void)
92839284
if (fullPageWrites == Insert->fullPageWrites)
92849285
return;
92859286

9287+
/*
9288+
* Perform this outside critical section so that the WAL insert
9289+
* initialization done by RecoveryInProgress() doesn't trigger an
9290+
* assertion failure.
9291+
*/
9292+
recoveryInProgress = RecoveryInProgress();
9293+
92869294
START_CRIT_SECTION();
92879295

92889296
/*
@@ -9303,7 +9311,7 @@ UpdateFullPageWrites(void)
93039311
* Write an XLOG_FPW_CHANGE record. This allows us to keep track of
93049312
* full_page_writes during archive recovery, if required.
93059313
*/
9306-
if (XLogStandbyInfoActive() && !RecoveryInProgress())
9314+
if (XLogStandbyInfoActive() && !recoveryInProgress)
93079315
{
93089316
XLogBeginInsert();
93099317
XLogRegisterData((char *) (&fullPageWrites), sizeof(bool));

0 commit comments

Comments
 (0)