aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2018-09-28 12:31:48 +0530
committerAmit Kapila <akapila@postgresql.org>2018-09-28 16:41:29 +0530
commit8256d7ae9ee3f8fec4bbe763b042b62d684e623f (patch)
tree0bfaadc13f7f4949327954d90c86874a24e5c439 /src
parent05b9c58da141f5be07556b532c58d7ce84d10d72 (diff)
downloadpostgresql-8256d7ae9ee3f8fec4bbe763b042b62d684e623f.tar.gz
postgresql-8256d7ae9ee3f8fec4bbe763b042b62d684e623f.zip
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 2c03216d83 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
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/xlog.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index b78009e888f..45ca90ca6c2 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -9601,6 +9601,7 @@ void
UpdateFullPageWrites(void)
{
XLogCtlInsert *Insert = &XLogCtl->Insert;
+ bool recoveryInProgress;
/*
* Do nothing if full_page_writes has not been changed.
@@ -9612,6 +9613,13 @@ UpdateFullPageWrites(void)
if (fullPageWrites == Insert->fullPageWrites)
return;
+ /*
+ * Perform this outside critical section so that the WAL insert
+ * initialization done by RecoveryInProgress() doesn't trigger an
+ * assertion failure.
+ */
+ recoveryInProgress = RecoveryInProgress();
+
START_CRIT_SECTION();
/*
@@ -9632,7 +9640,7 @@ UpdateFullPageWrites(void)
* Write an XLOG_FPW_CHANGE record. This allows us to keep track of
* full_page_writes during archive recovery, if required.
*/
- if (XLogStandbyInfoActive() && !RecoveryInProgress())
+ if (XLogStandbyInfoActive() && !recoveryInProgress)
{
XLogBeginInsert();
XLogRegisterData((char *) (&fullPageWrites), sizeof(bool));