diff options
author | Noah Misch <noah@leadboat.com> | 2024-09-17 19:53:11 -0700 |
---|---|---|
committer | Noah Misch <noah@leadboat.com> | 2024-09-17 19:54:26 -0700 |
commit | 507b72bd9f7de95a224ae5af8797f42bfce1ed9c (patch) | |
tree | 949db3287d2bc0cda064b7763b3d013d3215339e /src/backend/optimizer/plan/planner.c | |
parent | 011659d498357f4c0f243816140b09085422d309 (diff) |
Don't enter parallel mode when holding interrupts.
Doing so caused the leader to hang in wait_event=ParallelFinish, which
required an immediate shutdown to resolve. Back-patch to v12 (all
supported versions).
Francesco Degrassi
Discussion: https://postgr.es/m/CAC-SaSzHUKT=vZJ8MPxYdC_URPfax+yoA1hKTcF4ROz_Q6z0_Q@mail.gmail.com
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 65a9b0d802a..f7539fed6fb 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -331,6 +331,11 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams) * general; updates and deletes have additional problems especially around * combo CIDs.) * + * We don't try to use parallel mode unless interruptible. The leader + * expects ProcessInterrupts() calls to reach HandleParallelMessages(). + * Even if we called HandleParallelMessages() another way, starting a + * parallel worker is too delay-prone to be prudent when uncancellable. + * * For now, we don't try to use parallel mode if we're running inside a * parallel worker. We might eventually be able to relax this * restriction, but for now it seems best not to have parallel workers @@ -341,6 +346,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams) parse->commandType == CMD_SELECT && !parse->hasModifyingCTE && max_parallel_workers_per_gather > 0 && + INTERRUPTS_CAN_BE_PROCESSED() && !IsParallelWorker()) { /* all the cheap tests pass, so scan the query tree */ |