]> granicus.if.org Git - postgresql/commitdiff
Make error handling in parallel pg_upgrade less bogus.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 16 Dec 2018 19:51:47 +0000 (14:51 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 16 Dec 2018 19:51:47 +0000 (14:51 -0500)
reap_child() basically ignored the possibility of either an error in
waitpid() itself or a child process failure on signal.  We don't really
need to do more than report and crash hard, but proceeding as though
nothing is wrong is definitely Not Acceptable.  The error report for
nonzero child exit status was pretty off-point, as well.

Noted while fooling around with child-process failure detection
logic elsewhere.  It's been like this a long time, so back-patch to
all supported branches.

src/bin/pg_upgrade/parallel.c

index 23f869f6c7b72b2a1c842c5d3483921fbd15ca1a..49f0797cb3e6b3f53f4e1cbb78ea801047b0ab67 100644 (file)
@@ -290,7 +290,7 @@ reap_child(bool wait_for_child)
 {
 #ifndef WIN32
        int                     work_status;
-       int                     ret;
+       pid_t           child;
 #else
        int                     thread_num;
        DWORD           res;
@@ -300,14 +300,13 @@ reap_child(bool wait_for_child)
                return false;
 
 #ifndef WIN32
-       ret = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG);
-
-       /* no children or, for WNOHANG, no dead children */
-       if (ret <= 0 || !WIFEXITED(work_status))
-               return false;
-
-       if (WEXITSTATUS(work_status) != 0)
-               pg_fatal("child worker exited abnormally: %s\n", strerror(errno));
+       child = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG);
+       if (child == (pid_t) -1)
+               pg_fatal("waitpid() failed: %s\n", strerror(errno));
+       if (child == 0)
+               return false;                   /* no children, or no dead children */
+       if (work_status != 0)
+               pg_fatal("child process exited abnormally: status %d\n", work_status);
 #else
        /* wait for one to finish */
        thread_num = WaitForMultipleObjects(parallel_jobs, thread_handles,