diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c index 53c5254..6a6bf20 100644 --- a/src/backend/executor/execParallel.c +++ b/src/backend/executor/execParallel.c @@ -919,14 +919,25 @@ ExecParallelRetrieveInstrumentation(PlanState *planstate, * regular instrumentation information, which is the per-query context. * Switch into per-query memory context. */ - oldcontext = MemoryContextSwitchTo(planstate->state->es_query_cxt); - ibytes = mul_size(instrumentation->num_workers, sizeof(Instrumentation)); - planstate->worker_instrument = - palloc(ibytes + offsetof(WorkerInstrumentation, instrument)); - MemoryContextSwitchTo(oldcontext); + if (!planstate->worker_instrument) + { + oldcontext = MemoryContextSwitchTo(planstate->state->es_query_cxt); + ibytes = mul_size(instrumentation->num_workers, sizeof(Instrumentation)); + planstate->worker_instrument = + palloc(ibytes + offsetof(WorkerInstrumentation, instrument)); + MemoryContextSwitchTo(oldcontext); + + for (n = 0; n < instrumentation->num_workers; ++n) + InstrInit(&planstate->worker_instrument->instrument[n], + planstate->state->es_instrument); + } planstate->worker_instrument->num_workers = instrumentation->num_workers; - memcpy(&planstate->worker_instrument->instrument, instrument, ibytes); + + /* Accumulate the per-worker detail. */ + for (n = 0; n < instrumentation->num_workers; ++n) + InstrAggNode(&planstate->worker_instrument->instrument[n], + &instrument[n]); /* * Perform any node-type-specific work that needs to be done. Currently, @@ -989,8 +1000,20 @@ ExecParallelFinish(ParallelExecutorInfo *pei) /* Finally, accumulate instrumentation, if any. */ if (pei->instrumentation) + { + Instrumentation *instrument; + SharedExecutorInstrumentation *sh_instr; + + sh_instr = pei->instrumentation; + ExecParallelRetrieveInstrumentation(pei->planstate, - pei->instrumentation); + sh_instr); + + /* Clear the instrumentation space for next time. */ + instrument = GetInstrumentationArray(sh_instr); + for (i = 0; i < sh_instr->num_workers * sh_instr->num_plan_nodes; ++i) + InstrInit(&instrument[i], pei->planstate->state->es_instrument); + } pei->finished = true; }