postgres.git / summary / log / commit / refs

commit    35efdd7fb81de8333949e7d7ea55908cc91ba897
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sun Dec 16 19:51:48 2018 +0000
First released in: 12.0, 9.4.21, 9.5.16, 9.6.12, 10.7, 11.2

    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.


src/bin/pg_upgrade/parallel.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_upgrade/parallel.c b/src/bin/pg_upgrade/parallel.c index 97fa0dc356b..6920763b706 100644 --- a/src/bin/pg_upgrade/parallel.c +++ b/src/bin/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, [parent: ad6ebcfcbb88]