summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2018-12-16 14:51:48 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2018-12-16 14:51:48 -0500
commitb10d2252b35326566d5520acbc65842927c4c3a1 (patch)
tree30ebe7f04d0d6eb4c5d98fcb4c2474e55d810cf4
parentbf0e5a73be20b1f010b000c37c9980ac02809fb5 (diff)
Make error handling in parallel pg_upgrade less bogus.
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.
-rw-r--r--contrib/pg_upgrade/parallel.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/contrib/pg_upgrade/parallel.c b/contrib/pg_upgrade/parallel.c
index 5d2565d4410..63e295d22f1 100644
--- a/contrib/pg_upgrade/parallel.c
+++ b/contrib/pg_upgrade/parallel.c
@@ -294,7 +294,7 @@ reap_child(bool wait_for_child)
{
#ifndef WIN32
int work_status;
- int ret;
+ pid_t child;
#else
int thread_num;
DWORD res;
@@ -304,14 +304,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,