aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execParallel.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2015-11-18 12:35:25 -0500
committerRobert Haas <rhaas@postgresql.org>2015-11-18 12:35:25 -0500
commit166b61a88ef8e9fb97eba7b7ab8062e214c93af8 (patch)
tree36456939ecfd844777a7f5fd4150a59d068d5547 /src/backend/executor/execParallel.c
parentadeee974866085db84b860c1f397dd7c6b136a0a (diff)
downloadpostgresql-166b61a88ef8e9fb97eba7b7ab8062e214c93af8.tar.gz
postgresql-166b61a88ef8e9fb97eba7b7ab8062e214c93af8.zip
Avoid aggregating worker instrumentation multiple times.
Amit Kapila, per design ideas from me.
Diffstat (limited to 'src/backend/executor/execParallel.c')
-rw-r--r--src/backend/executor/execParallel.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c
index eae13c56477..67300377109 100644
--- a/src/backend/executor/execParallel.c
+++ b/src/backend/executor/execParallel.c
@@ -277,13 +277,15 @@ ExecParallelSetupTupleQueues(ParallelContext *pcxt, bool reinitialize)
}
/*
- * Re-initialize the response queues for backend workers to return tuples
- * to the main backend and start the workers.
+ * Re-initialize the parallel executor info such that it can be reused by
+ * workers.
*/
-shm_mq_handle **
-ExecParallelReinitializeTupleQueues(ParallelContext *pcxt)
+void
+ExecParallelReinitialize(ParallelExecutorInfo *pei)
{
- return ExecParallelSetupTupleQueues(pcxt, true);
+ ReinitializeParallelDSM(pei->pcxt);
+ pei->tqueue = ExecParallelSetupTupleQueues(pei->pcxt, true);
+ pei->finished = false;
}
/*
@@ -308,6 +310,7 @@ ExecInitParallelPlan(PlanState *planstate, EState *estate, int nworkers)
/* Allocate object for return value. */
pei = palloc0(sizeof(ParallelExecutorInfo));
+ pei->finished = false;
pei->planstate = planstate;
/* Fix up and serialize plan to be sent to workers. */
@@ -469,6 +472,9 @@ ExecParallelFinish(ParallelExecutorInfo *pei)
{
int i;
+ if (pei->finished)
+ return;
+
/* First, wait for the workers to finish. */
WaitForParallelWorkersToFinish(pei->pcxt);
@@ -480,6 +486,8 @@ ExecParallelFinish(ParallelExecutorInfo *pei)
if (pei->instrumentation)
ExecParallelRetrieveInstrumentation(pei->planstate,
pei->instrumentation);
+
+ pei->finished = true;
}
/*