Re: Parallel worker hangs while handling errors.
vignesh C <vignesh21@gmail.com>
From: vignesh C <vignesh21@gmail.com>
To: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>,
Robert Haas <robertmhaas@gmail.com>
Date: 2020-07-23T07:24:05Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-for-Parallel-worker-hangs-while-handling-errors.patch (text/x-patch) patch 0001
Thanks for reviewing and adding your thoughts, My comments are inline. On Fri, Jul 17, 2020 at 1:21 PM Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com> wrote: > > The same hang issue can occur(though I'm not able to back it up with a > use case), in the cases from wherever the EmitErrorReport() is called > from "if (sigsetjmp(local_sigjmp_buf, 1) != 0)" block, such as > autovacuum.c, bgwriter.c, bgworker.c, checkpointer.c, walwriter.c, and > postgres.c. > I'm not sure if this can occur in other cases. > > > > One of the fixes could be to call BackgroundWorkerUnblockSignals just > > after sigsetjmp. I'm not sure if this is the best solution. > > Robert & myself had a discussion about the problem yesterday. We felt > > this is a genuine problem with the parallel worker error handling and > > need to be fixed. > > > > Note that, in all sigsetjmp blocks, we intentionally > HOLD_INTERRUPTS(), to not cause any issues while performing error > handling, I'm concerned here that now, if we directly call > BackgroundWorkerUnblockSignals() which will open up all the signals > and our main intention of holding interrupts or block signals may go > away. > > Since the main problem for this hang issue is because of blocking > SIGUSR1, in sigsetjmp, can't we just only unblock only the SIGUSR1, > instead of unblocking all signals? I tried this with parallel copy > hang, the issue is resolved. > On putting further thoughts on this, I feel just unblocking SIGUSR1 would be the right approach in this case. I'm attaching a new patch which unblocks SIGUSR1 signal. I have verified that the original issue with WIP parallel copy patch gets fixed. I have made changes only in bgworker.c as we require the parallel worker to receive this signal and continue processing. I have not included the changes for other processes as I'm not sure if this scenario is applicable for other processes. Regards, Vignesh EnterpriseDB: http://www.enterprisedb.com
Commits
-
Centralize setup of SIGQUIT handling for postmaster child processes.
- 44fc6e259b79 14.0 landed
-
Accept SIGQUIT during error recovery in auxiliary processes.
- 7634bd4f6d38 14.0 landed
-
Avoid lockup of a parallel worker when reporting a long error message.
- be4b0c0077e6 14.0 landed
- 82dd373f2c56 12.5 landed
- 526df0a236df 11.10 landed
- 3738651f5b82 9.5.24 landed
- 2a938c7935cf 10.15 landed
- 2500e51e7bdc 9.6.20 landed
- 17424e79d979 13.0 landed