summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFujii Masao2013-08-07 17:48:53 +0000
committerFujii Masao2013-08-07 17:48:53 +0000
commit91c3613d3748d881706c3e60d8221ea92833ac1a (patch)
tree2e2881180ef759bbc5b319be15423dca59c8ec5e
parentf347f26807862522309a2b15e332518df3e5e6f0 (diff)
Fix assertion failure by an immediate shutdown.
In PM_WAIT_DEAD_END state, checkpointer process must be dead already. But an immediate shutdown could make postmaster's state machine transition to PM_WAIT_DEAD_END state even if checkpointer process is still running, and which caused assertion failure. This bug was introduced in commit 457d6cf049c57cabe9b46ea13f26138040a214ec. This patch ensures that postmaster's state machine doesn't transition to PM_WAIT_DEAD_END state in an immediate shutdown while checkpointer process is running.
-rw-r--r--src/backend/postmaster/postmaster.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index e6d750d4d38..5a816a2d3a7 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -3328,19 +3328,21 @@ PostmasterStateMachine(void)
* PM_WAIT_BACKENDS state ends when we have no regular backends
* (including autovac workers), no bgworkers (including unconnected
* ones), and no walwriter, autovac launcher or bgwriter. If we are
- * doing crash recovery then we expect the checkpointer to exit as
- * well, otherwise not. The archiver, stats, and syslogger processes
- * are disregarded since they are not connected to shared memory; we
- * also disregard dead_end children here. Walsenders are also
- * disregarded, they will be terminated later after writing the
- * checkpoint record, like the archiver process.
+ * doing crash recovery or an immediate shutdown then we expect
+ * the checkpointer to exit as well, otherwise not. The archiver,
+ * stats, and syslogger processes are disregarded since
+ * they are not connected to shared memory; we also disregard
+ * dead_end children here. Walsenders are also disregarded,
+ * they will be terminated later after writing the checkpoint record,
+ * like the archiver process.
*/
if (CountChildren(BACKEND_TYPE_NORMAL | BACKEND_TYPE_WORKER) == 0 &&
CountUnconnectedWorkers() == 0 &&
StartupPID == 0 &&
WalReceiverPID == 0 &&
BgWriterPID == 0 &&
- (CheckpointerPID == 0 || !FatalError) &&
+ (CheckpointerPID == 0 ||
+ (!FatalError && Shutdown < ImmediateShutdown)) &&
WalWriterPID == 0 &&
AutoVacPID == 0)
{