From 0f61727b75b93915ca9a9f20c996ed7020996a38 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 8 Apr 2021 11:16:01 -0400 Subject: [PATCH] Fixes for query_id feature Ignore parallel workers in pg_stat_statements Oversight in 4f0b0966c8 which exposed queryid in parallel workers. Counters are aggregated by the main backend process so parallel workers would report duplicated activity, and could also report activity for the wrong entry as they are only aware of the top level queryid. Fix thinko in pg_stat_get_activity when retrieving the queryid. Remove unnecessary call to pgstat_report_queryid(). Reported-by: Amit Kapila, Andres Freund, Thomas Munro Discussion: https://postgr.es/m/20210408051735.lfbdzun5zdlax5gd@alap3.anarazel.de p634GTSOqnDW86Owrn6qDAVosC5dJjXjp7BMfc5Gz1Q@mail.gmail.com Author: Julien Rouhaud --- contrib/pg_stat_statements/pg_stat_statements.c | 4 +++- src/backend/executor/execParallel.c | 1 - src/backend/utils/adt/pgstatfuncs.c | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 24b453adcb..f42f07622e 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -47,6 +47,7 @@ #include #include +#include "access/parallel.h" #include "catalog/pg_authid.h" #include "common/hashfn.h" #include "executor/instrument.h" @@ -278,8 +279,9 @@ static bool pgss_save; /* whether to save stats across shutdown */ #define pgss_enabled(level) \ + (!IsParallelWorker() && \ (pgss_track == PGSS_TRACK_ALL || \ - (pgss_track == PGSS_TRACK_TOP && (level) == 0)) + (pgss_track == PGSS_TRACK_TOP && (level) == 0))) #define record_gc_qtexts() \ do { \ diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c index d104a19767..4fca8782b2 100644 --- a/src/backend/executor/execParallel.c +++ b/src/backend/executor/execParallel.c @@ -1426,7 +1426,6 @@ ParallelQueryMain(dsm_segment *seg, shm_toc *toc) /* Report workers' query and queryId for monitoring purposes */ pgstat_report_activity(STATE_RUNNING, debug_query_string); - pgstat_report_queryid(queryDesc->plannedstmt->queryId, false); /* Attach to the dynamic shared memory area. */ area_space = shm_toc_lookup(toc, PARALLEL_KEY_DSA, false); diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 9fa4a93162..182b15e3f2 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -917,7 +917,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) if (beentry->st_queryid == 0) nulls[29] = true; else - values[29] = DatumGetUInt64(beentry->st_queryid); + values[29] = UInt64GetDatum(beentry->st_queryid); } else {