diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-07-27 01:46:03 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-07-27 01:46:03 +0000 |
commit | 0177f430701744432e4b5c4e145cd669fd3054cf (patch) | |
tree | 2bb78e43374c43eebd8f39ba422a1af512234bfc /src | |
parent | 23671f5a0ee739bd1fd805453487515d837c02d1 (diff) | |
download | postgresql-0177f430701744432e4b5c4e145cd669fd3054cf.tar.gz postgresql-0177f430701744432e4b5c4e145cd669fd3054cf.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ada0e61705c..eace246071b 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -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: |