aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2024-09-17 19:53:11 -0700
committerNoah Misch <noah@leadboat.com>2024-09-17 19:54:26 -0700
commit884860bfc0286ca35f7c097c2511bad90f4ede07 (patch)
treeeb7872745edba9cc80aa72bfc794b2ff538acfdf /src/backend
parentcbcd4bb415cff8d7224dd84084f93b82829c81a7 (diff)
downloadpostgresql-884860bfc0286ca35f7c097c2511bad90f4ede07.tar.gz
postgresql-884860bfc0286ca35f7c097c2511bad90f4ede07.zip
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')
-rw-r--r--src/backend/optimizer/plan/planner.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index bd4e4ceeca5..25b4a78b2b2 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -333,6 +333,11 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions,
* if we want to allow parallel inserts in 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
@@ -343,6 +348,7 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions,
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 */