Fix oversight: in case where SIGTERM is received while there are
authorTom Lane
Tue, 27 Jul 2004 01:46:03 +0000 (01:46 +0000)
committerTom Lane
Tue, 27 Jul 2004 01:46:03 +0000 (01:46 +0000)
live backends, the archiver and stats processes never got sent a
kill signal.  They'd eventually exit on their own, but not for awhile,
which is a bit annoying when you are trying to replace the executable
file on a platform that doesn't allow removal of busy executables.
Also, tweak main loop logic so that we will perform the background
tasks after select() returns EINTR.

src/backend/postmaster/postmaster.c

index ada0e61705c3b22c6ff364b5d738c8a6604eeb31..eace246071b354c7a4218f2d3bd1125855a6eff5 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.415 2004/07/24 20:01:42 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.416 2004/07/27 01:46:03 tgl Exp $
  *
  * NOTES
  *
@@ -1154,12 +1154,13 @@ ServerLoop(void)
 
        if (selres < 0)
        {
-           if (errno == EINTR || errno == EWOULDBLOCK)
-               continue;
-           ereport(LOG,
-                   (errcode_for_socket_access(),
-                    errmsg("select() failed in postmaster: %m")));
-           return STATUS_ERROR;
+           if (errno != EINTR && errno != EWOULDBLOCK)
+           {
+               ereport(LOG,
+                       (errcode_for_socket_access(),
+                        errmsg("select() failed in postmaster: %m")));
+               return STATUS_ERROR;
+           }
        }
 
        /*
@@ -2014,6 +2015,11 @@ reaper(SIGNAL_ARGS)
                 * We expect that it wrote a shutdown checkpoint.  (If
                 * for some reason it didn't, recovery will occur on next
                 * postmaster start.)
+                *
+                * Note: we do not wait around for exit of the archiver or
+                * stats processes.  They've been sent SIGQUIT by this
+                * point, and in any case contain logic to commit hara-kiri
+                * if they notice the postmaster is gone.
                 */
                ExitPostmaster(0);
            }
@@ -2095,6 +2101,12 @@ reaper(SIGNAL_ARGS)
        /* And tell it to shut down */
        if (BgWriterPID != 0)
            kill(BgWriterPID, SIGUSR2);
+       /* Tell pgarch to shut down too; nothing left for it to do */
+       if (PgArchPID != 0)
+           kill(PgArchPID, SIGQUIT);
+       /* Tell pgstat to shut down too; nothing left for it to do */
+       if (PgStatPID != 0)
+           kill(PgStatPID, SIGQUIT);
    }
 
 reaper_done: