From 0177f430701744432e4b5c4e145cd669fd3054cf Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 27 Jul 2004 01:46:03 +0000
Subject: [PATCH] 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.

---
 src/backend/postmaster/postmaster.c | 26 +++++++++++++++++++-------
 1 file 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:
-- 
GitLab