Skip to content

Commit 2a938c7

Browse files
committed
Avoid lockup of a parallel worker when reporting a long error message.
Because sigsetjmp() will restore the initial state with signals blocked, the code path in bgworker.c for reporting an error and exiting would execute that way. Usually this is fairly harmless; but if a parallel worker had an error message exceeding the shared-memory communication buffer size (16K) it would lock up, because it would wait for a resume-sending signal from its parallel leader which it would never detect. To fix, just unblock signals at the appropriate point. This can be shown to fail back to 9.6. The lack of parallel query infrastructure makes it difficult to provide a simple test case for 9.5; but I'm pretty sure the issue exists in some form there as well, so apply the code change there too. Vignesh C, reviewed by Bharath Rupireddy, Robert Haas, and myself Discussion: https://postgr.es/m/CALDaNm1d1hHPZUg3xU4XjtWBOLCrA+-2cJcLpw-cePZ=GgDVfA@mail.gmail.com
1 parent 579a022 commit 2a938c7

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

src/backend/postmaster/bgworker.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ StartBackgroundWorker(void)
758758
/*
759759
* If an exception is encountered, processing resumes here.
760760
*
761-
* See notes in postgres.c about the design of this coding.
761+
* We just need to clean up, report the error, and go away.
762762
*/
763763
if (sigsetjmp(local_sigjmp_buf, 1) != 0)
764764
{
@@ -768,7 +768,14 @@ StartBackgroundWorker(void)
768768
/* Prevent interrupts while cleaning up */
769769
HOLD_INTERRUPTS();
770770

771-
/* Report the error to the server log */
771+
/*
772+
* sigsetjmp will have blocked all signals, but we may need to accept
773+
* signals while communicating with our parallel leader. Once we've
774+
* done HOLD_INTERRUPTS() it should be safe to unblock signals.
775+
*/
776+
BackgroundWorkerUnblockSignals();
777+
778+
/* Report the error to the parallel leader and the server log */
772779
EmitErrorReport();
773780

774781
/*

0 commit comments

Comments
 (0)