Fix oversight: in case where SIGTERM is received while there are

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.
This commit is contained in:
Tom Lane 2004-07-27 01:46:03 +00:00
parent 23671f5a0e
commit 0177f43070
1 changed files with 19 additions and 7 deletions

View File

@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* *
@ -1154,12 +1154,13 @@ ServerLoop(void)
if (selres < 0) if (selres < 0)
{ {
if (errno == EINTR || errno == EWOULDBLOCK) if (errno != EINTR && errno != EWOULDBLOCK)
continue; {
ereport(LOG, ereport(LOG,
(errcode_for_socket_access(), (errcode_for_socket_access(),
errmsg("select() failed in postmaster: %m"))); errmsg("select() failed in postmaster: %m")));
return STATUS_ERROR; return STATUS_ERROR;
}
} }
/* /*
@ -2014,6 +2015,11 @@ reaper(SIGNAL_ARGS)
* We expect that it wrote a shutdown checkpoint. (If * We expect that it wrote a shutdown checkpoint. (If
* for some reason it didn't, recovery will occur on next * for some reason it didn't, recovery will occur on next
* postmaster start.) * 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); ExitPostmaster(0);
} }
@ -2095,6 +2101,12 @@ reaper(SIGNAL_ARGS)
/* And tell it to shut down */ /* And tell it to shut down */
if (BgWriterPID != 0) if (BgWriterPID != 0)
kill(BgWriterPID, SIGUSR2); 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: reaper_done: