diff options
author | Robert Haas <rhaas@postgresql.org> | 2015-11-18 12:35:25 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2015-11-18 12:35:25 -0500 |
commit | 166b61a88ef8e9fb97eba7b7ab8062e214c93af8 (patch) | |
tree | 36456939ecfd844777a7f5fd4150a59d068d5547 /src/backend/executor/execParallel.c | |
parent | adeee974866085db84b860c1f397dd7c6b136a0a (diff) | |
download | postgresql-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.c | 18 |
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; } /* |