]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
postmaster: Adjust which processes we expect to have exited
authorAndres Freund <andres@anarazel.de>
Fri, 24 Jan 2025 22:00:10 +0000 (17:00 -0500)
committerAndres Freund <andres@anarazel.de>
Fri, 24 Jan 2025 22:08:33 +0000 (17:08 -0500)
Comments and code stated that we expect checkpointer to have been signalled in
case of immediate shutdown / fatal errors, but didn't treat archiver and
walsenders the same. That doesn't seem right.

I had started digging through the history to see where this oddity was
introduced, but it's not the fault of a single commit.

Instead treat archiver, checkpointer, and walsenders the same.

Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Discussion: https://postgr.es/m/kgng5nrvnlv335evmsuvpnh354rw7qyazl73kdysev2cr2v5zu@m3cfzxicm5kp

src/backend/postmaster/postmaster.c

index 29624fa06bf3d89197836a5fcd0b4c09f42e9fb2..f410600f7a4ed385055fa5a3bd2d18e25a12d047 100644 (file)
@@ -2919,16 +2919,20 @@ PostmasterStateMachine(void)
 
                /*
                 * If we are doing crash recovery or an immediate shutdown then we
-                * expect the checkpointer to exit as well, otherwise not.
+                * expect archiver, checkpointer and walsender to exit as well,
+                * otherwise not.
                 */
                if (FatalError || Shutdown >= ImmediateShutdown)
-                       targetMask = btmask_add(targetMask, B_CHECKPOINTER);
+                       targetMask = btmask_add(targetMask,
+                                                                       B_CHECKPOINTER,
+                                                                       B_ARCHIVER,
+                                                                       B_WAL_SENDER);
 
                /*
-                * Walsenders and archiver will continue running; they will be
-                * terminated later after writing the checkpoint record.  We also let
-                * dead-end children to keep running for now.  The syslogger process
-                * exits last.
+                * Normally walsenders and archiver will continue running; they will
+                * be terminated later after writing the checkpoint record.  We also
+                * let dead-end children to keep running for now.  The syslogger
+                * process exits last.
                 *
                 * This assertion checks that we have covered all backend types,
                 * either by including them in targetMask, or by noting here that they
@@ -2939,13 +2943,17 @@ PostmasterStateMachine(void)
                        BackendTypeMask remainMask = BTYPE_MASK_NONE;
 
                        remainMask = btmask_add(remainMask,
-                                                                       B_WAL_SENDER,
-                                                                       B_ARCHIVER,
                                                                        B_DEAD_END_BACKEND,
                                                                        B_LOGGER);
 
-                       /* checkpointer may or may not be in targetMask already */
-                       remainMask = btmask_add(remainMask, B_CHECKPOINTER);
+                       /*
+                        * Archiver, checkpointer and walsender may or may not be in
+                        * targetMask already.
+                        */
+                       remainMask = btmask_add(remainMask,
+                                                                       B_ARCHIVER,
+                                                                       B_CHECKPOINTER,
+                                                                       B_WAL_SENDER);
 
                        /* these are not real postmaster children */
                        remainMask = btmask_add(remainMask,