On Sat, Jul 25, 2020 at 7:02 AM vignesh C <vignes...@gmail.com> wrote: > > I have made slight changes on top of the patch to remove duplicate > code, attached v3 patch for the same. > The parallel worker hang issue gets resolved, make check & make > check-world passes. >
Having a function to unblock selective signals for a bg worker looks good to me. Few comments: 1. Do we need "worker" as a function argument in update_parallel_worker_sigmask(BackgroundWorker *worker,.... ? Since MyBgworkerEntry is a global variable, can't we have a local variable instead? 2. Instead of update_parallel_worker_sigmask() serving only for parallel workers, can we make it generic, so that for any bgworker, given a signal it unblocks it, although there's no current use case for a bg worker unblocking a single signal other than a parallel worker doing it for SIGUSR1 for this hang issue. Please note that we have BackgroundWorkerBlockSignals() and BackgroundWorkerUnblockSignals(). I slightly modified your function, something like below? void BackgroundWorkerUpdateSignalMask(int signum, bool toblock) { if (toblock) sigaddset(&BlockSig, signum); else sigdelset(&BlockSig, signum); PG_SETMASK(&BlockSig); } /*to unblock SIGUSR1*/ if ((worker->bgw_flags & BGWORKER_CLASS_PARALLEL) != 0) BackgroundWorkerUpdateSignalMask(SIGUSR1, false); /*to block SIGUSR1*/ if ((worker->bgw_flags & BGWORKER_CLASS_PARALLEL) != 0) BackgroundWorkerUpdateSignalMask(SIGUSR1, true); If okay, with the BackgroundWorkerUpdateSignalMask() function, please note that we might have to add it in bgworker.sgml as well. With Regards, Bharath Rupireddy. EnterpriseDB: http://www.enterprisedb.com