On Wed, Nov 18, 2015 at 12:59 AM, Robert Haas <
robertmhaas@gmail.com> wrote:
>
> On Thu, Nov 12, 2015 at 10:23 AM, Amit Kapila <
amit.kapila16@gmail.com> wrote:
> > Thanks for the report. The reason for this problem is that instrumentation
> > information from workers is getting aggregated multiple times. In
> > ExecShutdownGatherWorkers(), we call ExecParallelFinish where it
> > will wait for workers to finish and then accumulate stats from workers.
> > Now ExecShutdownGatherWorkers() could be called multiple times
> > (once we read all tuples from workers, at end of node) and it should be
> > ensured that repeated calls should not try to redo the work done by first
> > call.
> > The same is ensured for tuplequeues, but not for parallel executor info.
> > I think we can safely assume that we need to call ExecParallelFinish() only
> > when there are workers started by the Gathers node, so on those lines
> > attached patch should fix the problem.
>
> I suggest that we instead fix ExecParallelFinish() to be idempotent.
> Add a "bool finished" flag to ParallelExecutorInfo and return at once
> if it's already set. Get rid of the exposed
> ExecParallelReinitializeTupleQueues() interface and have
> ExecParallelReinitialize(pei) instead. Have that call
> ReinitializeParallelDSM(), ExecParallelSetupTupleQueues(pei->pcxt,
> true), and set pei->finished = false. I think that would give us a
> slightly cleaner separation of concerns between nodeGather.c and
> execParallel.c.
>
Okay, attached patch fixes the issue as per above suggestion.