V6_0003-Adds-two-parallel-workers-stat-columns-for-utilities.patch
text/x-patch
Filename: V6_0003-Adds-two-parallel-workers-stat-columns-for-utilities.patch
Type: text/x-patch
Part: 0
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 0003
Subject: Adds two parallel workers stat columns for utilities to pg_stat_database
| File | + | − |
|---|---|---|
| doc/src/sgml/monitoring.sgml | 18 | 0 |
| src/backend/access/brin/brin.c | 4 | 0 |
| src/backend/access/nbtree/nbtsort.c | 4 | 0 |
| src/backend/catalog/system_views.sql | 2 | 0 |
| src/backend/commands/vacuumparallel.c | 6 | 0 |
| src/backend/utils/activity/pgstat_database.c | 18 | 0 |
| src/backend/utils/adt/pgstatfuncs.c | 6 | 0 |
| src/include/catalog/pg_proc.dat | 10 | 0 |
| src/include/pgstat.h | 3 | 0 |
| src/test/regress/expected/rules.out | 2 | 0 |
| src/test/regress/expected/vacuum_parallel.out | 19 | 0 |
| src/test/regress/sql/vacuum_parallel.sql | 11 | 0 |
From ab9aa1344f974348638dd3898c944f3d5253374d Mon Sep 17 00:00:00 2001
From: benoit <benoit.lobreau@dalibo.com>
Date: Tue, 8 Oct 2024 10:01:52 +0200
Subject: [PATCH 3/3] Adds two parallel workers stat columns for utilities to
pg_stat_database
* parallel_maint_workers_to_launch
* parallel_maint_workers_launched
---
doc/src/sgml/monitoring.sgml | 18 ++++++++++++++++++
src/backend/access/brin/brin.c | 4 ++++
src/backend/access/nbtree/nbtsort.c | 4 ++++
src/backend/catalog/system_views.sql | 2 ++
src/backend/commands/vacuumparallel.c | 6 ++++++
src/backend/utils/activity/pgstat_database.c | 18 ++++++++++++++++++
src/backend/utils/adt/pgstatfuncs.c | 6 ++++++
src/include/catalog/pg_proc.dat | 10 ++++++++++
src/include/pgstat.h | 3 +++
src/test/regress/expected/rules.out | 2 ++
src/test/regress/expected/vacuum_parallel.out | 19 +++++++++++++++++++
src/test/regress/sql/vacuum_parallel.sql | 11 +++++++++++
12 files changed, 103 insertions(+)
diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index 840d7f8161..bd4e4b63c7 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -3629,6 +3629,24 @@ description | Waiting for a newly initialized WAL file to reach durable storage
</para></entry>
</row>
+ <row>
+ <entry role="catalog_table_entry"><para role="column_definition">
+ <structfield>parallel_maint_workers_to_launch</structfield> <type>bigint</type>
+ </para>
+ <para>
+ Number of parallel workers planned to be launched by utilities on this database
+ </para></entry>
+ </row>
+
+ <row>
+ <entry role="catalog_table_entry"><para role="column_definition">
+ <structfield>parallel_maint_workers_launched</structfield> <type>bigint</type>
+ </para>
+ <para>
+ Number of parallel workers launched by utilities on this database
+ </para></entry>
+ </row>
+
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>stats_reset</structfield> <type>timestamp with time zone</type>
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index c0b978119a..4e83091d2c 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -2544,6 +2544,10 @@ _brin_end_parallel(BrinLeader *brinleader, BrinBuildState *state)
/* Shutdown worker processes */
WaitForParallelWorkersToFinish(brinleader->pcxt);
+ pgstat_update_parallel_maint_workers_stats(
+ (PgStat_Counter) brinleader->pcxt->nworkers_to_launch,
+ (PgStat_Counter) brinleader->pcxt->nworkers_launched);
+
/*
* Next, accumulate WAL usage. (This must wait for the workers to finish,
* or we might get incomplete data.)
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index 5cca0d4f52..8ee5fcf6d3 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -1615,6 +1615,10 @@ _bt_end_parallel(BTLeader *btleader)
/* Shutdown worker processes */
WaitForParallelWorkersToFinish(btleader->pcxt);
+ pgstat_update_parallel_maint_workers_stats(
+ (PgStat_Counter) btleader->pcxt->nworkers_to_launch,
+ (PgStat_Counter) btleader->pcxt->nworkers_launched);
+
/*
* Next, accumulate WAL usage. (This must wait for the workers to finish,
* or we might get incomplete data.)
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index da9a8fe99f..648166bb3b 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -1075,6 +1075,8 @@ CREATE VIEW pg_stat_database AS
pg_stat_get_db_sessions_killed(D.oid) AS sessions_killed,
pg_stat_get_db_parallel_workers_to_launch(D.oid) as parallel_workers_to_launch,
pg_stat_get_db_parallel_workers_launched(D.oid) as parallel_workers_launched,
+ pg_stat_get_db_parallel_maint_workers_to_launch(D.oid) as parallel_maint_workers_to_launch,
+ pg_stat_get_db_parallel_maint_workers_launched(D.oid) as parallel_maint_workers_launched,
pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset
FROM (
SELECT 0 AS oid, NULL::name AS datname
diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index 77679e8df6..edd0823353 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -443,6 +443,12 @@ parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats)
{
Assert(!IsParallelWorker());
+ if (pvs->nworkers_to_launch > 0)
+ pgstat_update_parallel_maint_workers_stats(
+ (PgStat_Counter) pvs->pcxt->nworkers_to_launch,
+ (PgStat_Counter) pvs->pcxt->nworkers_launched
+ );
+
/* Copy the updated statistics */
for (int i = 0; i < pvs->nindexes; i++)
{
diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c
index efa3d51408..38daf6d978 100644
--- a/src/backend/utils/activity/pgstat_database.c
+++ b/src/backend/utils/activity/pgstat_database.c
@@ -278,6 +278,22 @@ pgstat_update_parallel_workers_stats(PgStat_Counter parallel_workers_to_launch,
dbentry->parallel_workers_launched += parallel_workers_launched;
}
+/*
+ * reports parallel_maint_workers_to_launch and parallel_maint_workers_launched into
+ * PgStat_StatDBEntry
+ */
+void
+pgstat_update_parallel_maint_workers_stats(PgStat_Counter parallel_maint_workers_to_launch, PgStat_Counter parallel_maint_workers_launched)
+{
+ PgStat_StatDBEntry *dbentry;
+ if (!OidIsValid(MyDatabaseId))
+ return;
+
+ dbentry = pgstat_prep_database_pending(MyDatabaseId);
+ dbentry->parallel_maint_workers_to_launch += parallel_maint_workers_to_launch;
+ dbentry->parallel_maint_workers_launched += parallel_maint_workers_launched;
+}
+
/*
* Subroutine for pgstat_report_stat(): Handle xact commit/rollback and I/O
* timings.
@@ -443,6 +459,8 @@ pgstat_database_flush_cb(PgStat_EntryRef *entry_ref, bool nowait)
PGSTAT_ACCUM_DBCOUNT(sessions_killed);
PGSTAT_ACCUM_DBCOUNT(parallel_workers_to_launch);
PGSTAT_ACCUM_DBCOUNT(parallel_workers_launched);
+ PGSTAT_ACCUM_DBCOUNT(parallel_maint_workers_to_launch);
+ PGSTAT_ACCUM_DBCOUNT(parallel_maint_workers_launched);
#undef PGSTAT_ACCUM_DBCOUNT
pgstat_unlock_entry(entry_ref);
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 054c416ab4..13d5ea7a5c 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -1045,6 +1045,12 @@ PG_STAT_GET_DBENTRY_INT64(parallel_workers_to_launch)
/* pg_stat_get_db_parallel_workers_launched*/
PG_STAT_GET_DBENTRY_INT64(parallel_workers_launched)
+/* pg_stat_get_db_parallel_maint_workers_to_launch*/
+PG_STAT_GET_DBENTRY_INT64(parallel_maint_workers_to_launch)
+
+/* pg_stat_get_db_parallel_maint_workers_launched*/
+PG_STAT_GET_DBENTRY_INT64(parallel_maint_workers_launched)
+
/* pg_stat_get_db_temp_bytes */
PG_STAT_GET_DBENTRY_INT64(temp_bytes)
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index fe05b279f2..16cb46f343 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -5820,6 +5820,16 @@
proname => 'pg_stat_get_db_parallel_workers_launched', provolatile => 's',
proparallel => 'r', prorettype => 'int8', proargtypes => 'oid',
prosrc => 'pg_stat_get_db_parallel_workers_launched' },
+{ oid => '8405',
+ descr => 'statistics: number of parallel workers planned to be launched for utilities',
+ proname => 'pg_stat_get_db_parallel_maint_workers_to_launch', provolatile => 's',
+ proparallel => 'r', prorettype => 'int8', proargtypes => 'oid',
+ prosrc => 'pg_stat_get_db_parallel_maint_workers_to_launch' },
+{ oid => '8406',
+ descr => 'statistics: number of parallel workers effectively launched for utilities',
+ proname => 'pg_stat_get_db_parallel_maint_workers_launched', provolatile => 's',
+ proparallel => 'r', prorettype => 'int8', proargtypes => 'oid',
+ prosrc => 'pg_stat_get_db_parallel_maint_workers_launched' },
{ oid => '3195', descr => 'statistics: information about WAL archiver',
proname => 'pg_stat_get_archiver', proisstrict => 'f', provolatile => 's',
proparallel => 'r', prorettype => 'record', proargtypes => '',
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index cfba5615a7..3718d31cf6 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -389,6 +389,8 @@ typedef struct PgStat_StatDBEntry
PgStat_Counter parallel_workers_to_launch;
PgStat_Counter parallel_workers_launched;
+ PgStat_Counter parallel_maint_workers_to_launch;
+ PgStat_Counter parallel_maint_workers_launched;
TimestampTz stat_reset_timestamp;
} PgStat_StatDBEntry;
@@ -587,6 +589,7 @@ extern void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount);
extern void pgstat_report_checksum_failure(void);
extern void pgstat_report_connect(Oid dboid);
extern void pgstat_update_parallel_workers_stats(PgStat_Counter parallel_workers_to_launch, PgStat_Counter parallel_workers_launched);
+extern void pgstat_update_parallel_maint_workers_stats(PgStat_Counter parallel_maint_workers_to_launch, PgStat_Counter parallel_maint_workers_launched);
#define pgstat_count_buffer_read_time(n) \
(pgStatBlockReadTime += (n))
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 3014d047fe..e696baa8f3 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1865,6 +1865,8 @@ pg_stat_database| SELECT oid AS datid,
pg_stat_get_db_sessions_killed(oid) AS sessions_killed,
pg_stat_get_db_parallel_workers_to_launch(oid) AS parallel_workers_to_launch,
pg_stat_get_db_parallel_workers_launched(oid) AS parallel_workers_launched,
+ pg_stat_get_db_parallel_maint_workers_to_launch(oid) AS parallel_maint_workers_to_launch,
+ pg_stat_get_db_parallel_maint_workers_launched(oid) AS parallel_maint_workers_launched,
pg_stat_get_db_stat_reset_time(oid) AS stats_reset
FROM ( SELECT 0 AS oid,
NULL::name AS datname
diff --git a/src/test/regress/expected/vacuum_parallel.out b/src/test/regress/expected/vacuum_parallel.out
index ddf0ee544b..4973c7bdae 100644
--- a/src/test/regress/expected/vacuum_parallel.out
+++ b/src/test/regress/expected/vacuum_parallel.out
@@ -37,9 +37,28 @@ WHERE oid in ('regular_sized_index'::regclass, 'typically_sized_index'::regclass
2
(1 row)
+-- Get a reference for parallel stats in pg_stat_database
+SELECT sum(parallel_maint_workers_to_launch) AS parallel_maint_workers_to_launch_before,
+ sum(parallel_maint_workers_launched) AS parallel_maint_workers_launched_before
+FROM pg_stat_database \gset
-- Parallel VACUUM with B-Tree page deletions, ambulkdelete calls:
DELETE FROM parallel_vacuum_table;
VACUUM (PARALLEL 4, INDEX_CLEANUP ON) parallel_vacuum_table;
+-- Check parallel stats in pg_stat_database
+SELECT pg_stat_force_next_flush();
+ pg_stat_force_next_flush
+--------------------------
+
+(1 row)
+
+SELECT sum(parallel_maint_workers_to_launch) > :'parallel_maint_workers_to_launch_before' AS maint_wrk_to_launch,
+ sum(parallel_maint_workers_launched) > :'parallel_maint_workers_launched_before' AS maint_wrk_launched
+FROM pg_stat_database;
+ maint_wrk_to_launch | maint_wrk_launched
+---------------------+--------------------
+ t | t
+(1 row)
+
-- Since vacuum_in_leader_small_index uses deduplication, we expect an
-- assertion failure with bug #17245 (in the absence of bugfix):
INSERT INTO parallel_vacuum_table SELECT i FROM generate_series(1, 10000) i;
diff --git a/src/test/regress/sql/vacuum_parallel.sql b/src/test/regress/sql/vacuum_parallel.sql
index 1d23f33e39..77ddc807cd 100644
--- a/src/test/regress/sql/vacuum_parallel.sql
+++ b/src/test/regress/sql/vacuum_parallel.sql
@@ -31,10 +31,21 @@ WHERE oid in ('regular_sized_index'::regclass, 'typically_sized_index'::regclass
pg_relation_size(oid) >=
pg_size_bytes(current_setting('min_parallel_index_scan_size'));
+-- Get a reference for parallel stats in pg_stat_database
+SELECT sum(parallel_maint_workers_to_launch) AS parallel_maint_workers_to_launch_before,
+ sum(parallel_maint_workers_launched) AS parallel_maint_workers_launched_before
+FROM pg_stat_database \gset
+
-- Parallel VACUUM with B-Tree page deletions, ambulkdelete calls:
DELETE FROM parallel_vacuum_table;
VACUUM (PARALLEL 4, INDEX_CLEANUP ON) parallel_vacuum_table;
+-- Check parallel stats in pg_stat_database
+SELECT pg_stat_force_next_flush();
+SELECT sum(parallel_maint_workers_to_launch) > :'parallel_maint_workers_to_launch_before' AS maint_wrk_to_launch,
+ sum(parallel_maint_workers_launched) > :'parallel_maint_workers_launched_before' AS maint_wrk_launched
+FROM pg_stat_database;
+
-- Since vacuum_in_leader_small_index uses deduplication, we expect an
-- assertion failure with bug #17245 (in the absence of bugfix):
INSERT INTO parallel_vacuum_table SELECT i FROM generate_series(1, 10000) i;
--
2.46.2