aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-07-27 01:46:03 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-07-27 01:46:03 +0000
commit0177f430701744432e4b5c4e145cd669fd3054cf (patch)
tree2bb78e43374c43eebd8f39ba422a1af512234bfc /src
parent23671f5a0ee739bd1fd805453487515d837c02d1 (diff)
downloadpostgresql-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.c26
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: