mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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.
This commit is contained in:
		@@ -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,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user