From 005bd50afb94e9876962edbb8d8d32a2843f9feb Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Fri, 10 Aug 2018 10:49:57 +0530
Subject: [PATCH 3/4] Handle postmaster death, CFI, improve error messages and
 comments.

---
 src/backend/postmaster/checkpointer.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index 6250cb21946..16a57090fe7 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -1302,9 +1302,12 @@ static void
 SendFsyncRequest(CheckpointerRequest *request, int fd)
 {
 	ssize_t ret;
+	int		rc;
 
 	while (true)
 	{
+		CHECK_FOR_INTERRUPTS();
+
 		ret = pg_uds_send_with_fd(fsync_fds[FSYNC_FD_SUBMIT], request, sizeof(*request),
 								  request->contains_fd ? fd : -1);
 
@@ -1315,18 +1318,19 @@ SendFsyncRequest(CheckpointerRequest *request, int fd)
 			 * implementations, but better make sure that's true...
 			 */
 			if (ret != sizeof(*request))
-				elog(FATAL, "oops, gotta do better");
+				elog(FATAL, "unexpected short write to fsync request socket");
 			break;
 		}
 		else if (errno == EWOULDBLOCK || errno == EAGAIN)
 		{
 			/* blocked on write - wait for socket to become readable */
-			/* FIXME: postmaster death? Other interrupts? */
-			WaitLatchOrSocket(NULL, WL_SOCKET_WRITEABLE, fsync_fds[FSYNC_FD_SUBMIT], -1, 0);
+			rc = WaitLatchOrSocket(NULL,
+								   WL_SOCKET_WRITEABLE | WL_POSTMASTER_DEATH,
+								   fsync_fds[FSYNC_FD_SUBMIT], -1, 0);
+			if (rc & WL_POSTMASTER_DEATH)
+				exit(1);
 		}
 		else
-		{
 			ereport(FATAL, (errmsg("could not receive fsync request: %m")));
-		}
 	}
 }
-- 
2.17.0

