From 005bd50afb94e9876962edbb8d8d32a2843f9feb Mon Sep 17 00:00:00 2001 From: Thomas Munro 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