V3_0005-Implements-logging-for-parallel-worker-usage-in-quer.patch
text/x-patch
Filename: V3_0005-Implements-logging-for-parallel-worker-usage-in-quer.patch
Type: text/x-patch
Part: 0
Message:
Re: Logging parallel worker draught
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0005
Subject: Implements logging for parallel worker usage in queries
| File | + | − |
|---|---|---|
| src/backend/executor/execMain.c | 12 | 0 |
| src/backend/executor/execUtils.c | 3 | 0 |
| src/backend/executor/nodeGather.c | 5 | 0 |
| src/backend/executor/nodeGatherMerge.c | 5 | 0 |
| src/include/nodes/execnodes.h | 4 | 0 |
From cfa4263333a080ca2d0c484ac8f5201800bd6434 Mon Sep 17 00:00:00 2001 From: benoit <benoit.lobreau@dalibo.com> Date: Fri, 11 Oct 2024 23:59:15 +0200 Subject: [PATCH 5/5] Implements logging for parallel worker usage in queries --- src/backend/executor/execMain.c | 12 ++++++++++++ src/backend/executor/execUtils.c | 3 +++ src/backend/executor/nodeGather.c | 5 +++++ src/backend/executor/nodeGatherMerge.c | 5 +++++ src/include/nodes/execnodes.h | 4 ++++ 5 files changed, 29 insertions(+) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index cc9a594cba..6663fea7b1 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -483,6 +483,18 @@ standard_ExecutorEnd(QueryDesc *queryDesc) Assert(estate != NULL); + if ((log_parallel_workers == LOG_PARALLEL_WORKERS_ALL && + estate->es_parallel_workers_to_launch > 0) || + (log_parallel_workers == LOG_PARALLEL_WORKERS_FAILURE && + estate->es_parallel_workers_to_launch != estate->es_parallel_workers_launched)) + elog(LOG, "%i parallel nodes planned (%i obtained all their workers, %i obtained none), " + "%i workers planned to be launched (%i workers launched)", + estate->es_parallel_nodes, + estate->es_parallel_nodes_success, + estate->es_parallel_nodes_no_workers, + estate->es_parallel_workers_to_launch, + estate->es_parallel_workers_launched); + /* * Check that ExecutorFinish was called, unless in EXPLAIN-only mode. This * Assert is needed because ExecutorFinish is new as of 9.1, and callers diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 6712302ec8..fd463f7e4c 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -160,6 +160,9 @@ CreateExecutorState(void) estate->es_use_parallel_mode = false; estate->es_parallel_workers_to_launch = 0; estate->es_parallel_workers_launched = 0; + estate->es_parallel_nodes = 0; + estate->es_parallel_nodes_success = 0; + estate->es_parallel_nodes_no_workers = 0; estate->es_jit_flags = 0; estate->es_jit = NULL; diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index 7f7edc7f9f..49a96f7cbf 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -188,6 +188,10 @@ ExecGather(PlanState *pstate) */ estate->es_parallel_workers_to_launch += pcxt->nworkers_to_launch; estate->es_parallel_workers_launched += pcxt->nworkers_launched; + estate->es_parallel_nodes += 1; + + if (pcxt->nworkers_to_launch == pcxt->nworkers_launched) + estate->es_parallel_nodes_success += 1; /* Set up tuple queue readers to read the results. */ if (pcxt->nworkers_launched > 0) @@ -205,6 +209,7 @@ ExecGather(PlanState *pstate) /* No workers? Then never mind. */ node->nreaders = 0; node->reader = NULL; + estate->es_parallel_nodes_no_workers += 1; } node->nextreader = 0; } diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c index bc99c0b448..f3aa7ee14f 100644 --- a/src/backend/executor/nodeGatherMerge.c +++ b/src/backend/executor/nodeGatherMerge.c @@ -229,6 +229,10 @@ ExecGatherMerge(PlanState *pstate) */ estate->es_parallel_workers_to_launch += pcxt->nworkers_to_launch; estate->es_parallel_workers_launched += pcxt->nworkers_launched; + estate->es_parallel_nodes += 1; + + if (pcxt->nworkers_to_launch == pcxt->nworkers_launched) + estate->es_parallel_nodes_success += 1; /* Set up tuple queue readers to read the results. */ if (pcxt->nworkers_launched > 0) @@ -246,6 +250,7 @@ ExecGatherMerge(PlanState *pstate) /* No workers? Then never mind. */ node->nreaders = 0; node->reader = NULL; + estate->es_parallel_nodes_no_workers += 1; } } diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index e4698a28c4..d87af53853 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -713,6 +713,10 @@ typedef struct EState int es_parallel_workers_launched; /* number of workers actually * launched. */ + int es_parallel_nodes; + int es_parallel_nodes_success; + int es_parallel_nodes_no_workers; + /* The per-query shared memory area to use for parallel execution. */ struct dsa_area *es_query_dsa; -- 2.46.2