mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Propagate sort instrumentation from workers back to leader.
Up until now, when parallel query was used, no details about the sort method or space used by the workers were available; details were shown only for any sorting done by the leader. Fix that. Commit1177ab1dab
forced the test case added by commit1f6d515a67
to run without parallelism; now that we have this infrastructure, allow that again, with a little tweaking to make it pass with and without force_parallel_mode. Robert Haas and Tom Lane Discussion: http://postgr.es/m/CA+Tgmoa2VBZW6S8AAXfhpHczb=Rf6RqQ2br+zJvEgwJ0uoD_tQ@mail.gmail.com
This commit is contained in:
@ -15,6 +15,7 @@
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/parallel.h"
|
||||
#include "executor/execdebug.h"
|
||||
#include "executor/nodeSort.h"
|
||||
#include "miscadmin.h"
|
||||
@ -127,6 +128,15 @@ ExecSort(PlanState *pstate)
|
||||
node->sort_Done = true;
|
||||
node->bounded_Done = node->bounded;
|
||||
node->bound_Done = node->bound;
|
||||
if (node->shared_info && node->am_worker)
|
||||
{
|
||||
TuplesortInstrumentation *si;
|
||||
|
||||
Assert(IsParallelWorker());
|
||||
Assert(ParallelWorkerNumber <= node->shared_info->num_workers);
|
||||
si = &node->shared_info->sinstrument[ParallelWorkerNumber];
|
||||
tuplesort_get_stats(tuplesortstate, si);
|
||||
}
|
||||
SO1_printf("ExecSort: %s\n", "sorting done");
|
||||
}
|
||||
|
||||
@ -334,3 +344,90 @@ ExecReScanSort(SortState *node)
|
||||
else
|
||||
tuplesort_rescan((Tuplesortstate *) node->tuplesortstate);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Parallel Query Support
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecSortEstimate
|
||||
*
|
||||
* Estimate space required to propagate sort statistics.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecSortEstimate(SortState *node, ParallelContext *pcxt)
|
||||
{
|
||||
Size size;
|
||||
|
||||
/* don't need this if not instrumenting or no workers */
|
||||
if (!node->ss.ps.instrument || pcxt->nworkers == 0)
|
||||
return;
|
||||
|
||||
size = mul_size(pcxt->nworkers, sizeof(TuplesortInstrumentation));
|
||||
size = add_size(size, offsetof(SharedSortInfo, sinstrument));
|
||||
shm_toc_estimate_chunk(&pcxt->estimator, size);
|
||||
shm_toc_estimate_keys(&pcxt->estimator, 1);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecSortInitializeDSM
|
||||
*
|
||||
* Initialize DSM space for sort statistics.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecSortInitializeDSM(SortState *node, ParallelContext *pcxt)
|
||||
{
|
||||
Size size;
|
||||
|
||||
/* don't need this if not instrumenting or no workers */
|
||||
if (!node->ss.ps.instrument || pcxt->nworkers == 0)
|
||||
return;
|
||||
|
||||
size = offsetof(SharedSortInfo, sinstrument)
|
||||
+ pcxt->nworkers * sizeof(TuplesortInstrumentation);
|
||||
node->shared_info = shm_toc_allocate(pcxt->toc, size);
|
||||
/* ensure any unfilled slots will contain zeroes */
|
||||
memset(node->shared_info, 0, size);
|
||||
node->shared_info->num_workers = pcxt->nworkers;
|
||||
shm_toc_insert(pcxt->toc, node->ss.ps.plan->plan_node_id,
|
||||
node->shared_info);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecSortInitializeWorker
|
||||
*
|
||||
* Attach worker to DSM space for sort statistics.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecSortInitializeWorker(SortState *node, shm_toc *toc)
|
||||
{
|
||||
node->shared_info =
|
||||
shm_toc_lookup(toc, node->ss.ps.plan->plan_node_id, true);
|
||||
node->am_worker = true;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* ExecSortRetrieveInstrumentation
|
||||
*
|
||||
* Transfer sort statistics from DSM to private memory.
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
ExecSortRetrieveInstrumentation(SortState *node)
|
||||
{
|
||||
Size size;
|
||||
SharedSortInfo *si;
|
||||
|
||||
if (node->shared_info == NULL)
|
||||
return;
|
||||
|
||||
size = offsetof(SharedSortInfo, sinstrument)
|
||||
+ node->shared_info->num_workers * sizeof(TuplesortInstrumentation);
|
||||
si = palloc(size);
|
||||
memcpy(si, node->shared_info, size);
|
||||
node->shared_info = si;
|
||||
}
|
||||
|
Reference in New Issue
Block a user