From 090214a2f227ed832fec1d7e0d06cfdb0d7be0bd Mon Sep 17 00:00:00 2001 From: Shinya Kato Date: Fri, 2 May 2025 19:08:45 +0900 Subject: [PATCH v1 9/9] Make pg_stat_clear_snapshot() return the reset time --- doc/src/sgml/monitoring.sgml | 5 ++-- src/backend/utils/activity/pgstat.c | 4 +++- src/backend/utils/adt/pgstatfuncs.c | 6 +++-- src/include/catalog/pg_proc.dat | 2 +- src/include/pgstat.h | 2 +- src/test/isolation/expected/stats.out | 32 ++++++++++++------------- src/test/isolation/expected/stats_1.out | 32 ++++++++++++------------- src/test/isolation/specs/stats.spec | 2 +- src/test/regress/expected/stats.out | 8 +++---- src/test/regress/sql/stats.sql | 2 +- 10 files changed, 50 insertions(+), 45 deletions(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index e7ba7932b1a..8a1632eae0c 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -4995,10 +4995,11 @@ description | Waiting for a newly initialized WAL file to reach durable storage pg_stat_clear_snapshot pg_stat_clear_snapshot () - void + timestamp with time zone - Discards the current statistics snapshot or cached information. + Discards the current statistics snapshot or cached information, and + returns the time of the discard. diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index aecf9fbdcd1..d0702aa499d 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -902,7 +902,7 @@ pgstat_reset_of_kind(PgStat_Kind kind) * the no-longer-wanted snapshot. Updates of stats_fetch_consistency can * cause this routine to be called. */ -void +TimestampTz pgstat_clear_snapshot(void) { pgstat_assert_is_up(); @@ -932,6 +932,8 @@ pgstat_clear_snapshot(void) /* Reset this flag, as it may be possible that a cleanup was forced. */ force_stats_snapshot_clear = false; + + return GetCurrentTimestamp(); } void * diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 7b23fce1712..422944e75f2 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -1837,9 +1837,11 @@ pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS) Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS) { - pgstat_clear_snapshot(); + TimestampTz ts; - PG_RETURN_VOID(); + ts = pgstat_clear_snapshot(); + + PG_RETURN_TIMESTAMPTZ(ts); } diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 48d6f03afeb..52d140d24aa 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6130,7 +6130,7 @@ { oid => '2230', descr => 'statistics: discard current transaction\'s statistics snapshot', proname => 'pg_stat_clear_snapshot', proisstrict => 'f', provolatile => 'v', - proparallel => 'r', prorettype => 'void', proargtypes => '', + proparallel => 'r', prorettype => 'timestamptz', proargtypes => '', prosrc => 'pg_stat_clear_snapshot' }, { oid => '2137', descr => 'statistics: force stats to be flushed after the next commit', diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 96cfbaab798..6aeeb561435 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -529,7 +529,7 @@ extern TimestampTz pgstat_reset(PgStat_Kind kind, Oid dboid, uint64 objid); extern TimestampTz pgstat_reset_of_kind(PgStat_Kind kind); /* stats accessors */ -extern void pgstat_clear_snapshot(void); +extern TimestampTz pgstat_clear_snapshot(void); extern TimestampTz pgstat_get_stat_snapshot_timestamp(bool *have_snapshot); /* helpers */ diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out index 132f8e55fc3..43cfc1880c6 100644 --- a/src/test/isolation/expected/stats.out +++ b/src/test/isolation/expected/stats.out @@ -3422,10 +3422,10 @@ step s1_slru_check_stats: t (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_slru_check_stats: @@ -3495,10 +3495,10 @@ step s1_slru_check_stats: f (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_slru_check_stats: @@ -3568,10 +3568,10 @@ step s1_slru_check_stats: f (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_slru_check_stats: @@ -3712,10 +3712,10 @@ name |pg_stat_get_function_calls|total_above_zero|self_above_zero test_stat_func| | | (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_func_stats: diff --git a/src/test/isolation/expected/stats_1.out b/src/test/isolation/expected/stats_1.out index 2b16808fbb5..f83420dcd7d 100644 --- a/src/test/isolation/expected/stats_1.out +++ b/src/test/isolation/expected/stats_1.out @@ -3446,10 +3446,10 @@ step s1_slru_check_stats: t (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_slru_check_stats: @@ -3519,10 +3519,10 @@ step s1_slru_check_stats: f (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_slru_check_stats: @@ -3592,10 +3592,10 @@ step s1_slru_check_stats: f (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_slru_check_stats: @@ -3736,10 +3736,10 @@ name |pg_stat_get_function_calls|total_above_zero|self_above_zero test_stat_func| | | (1 row) -step s1_clear_snapshot: SELECT pg_stat_clear_snapshot(); -pg_stat_clear_snapshot ----------------------- - +step s1_clear_snapshot: SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; +t +- +t (1 row) step s1_func_stats: diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec index 3893d3983f0..7e211d3fa83 100644 --- a/src/test/isolation/specs/stats.spec +++ b/src/test/isolation/specs/stats.spec @@ -40,7 +40,7 @@ setup { SET stats_fetch_consistency = 'none'; } step s1_fetch_consistency_none { SET stats_fetch_consistency = 'none'; } step s1_fetch_consistency_cache { SET stats_fetch_consistency = 'cache'; } step s1_fetch_consistency_snapshot { SET stats_fetch_consistency = 'snapshot'; } -step s1_clear_snapshot { SELECT pg_stat_clear_snapshot(); } +step s1_clear_snapshot { SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; } step s1_begin { BEGIN; } step s1_commit { COMMIT; } step s1_rollback { ROLLBACK; } diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 4c5612ab1ba..7d13fca9e51 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -1147,10 +1147,10 @@ SELECT pg_stat_get_snapshot_timestamp() >= NOW(); (1 row) -- shows NULL again after clearing -SELECT pg_stat_clear_snapshot(); - pg_stat_clear_snapshot ------------------------- - +SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; + t +--- + t (1 row) SELECT pg_stat_get_snapshot_timestamp(); diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 62a8424d4c0..aab46b91ad0 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -529,7 +529,7 @@ SELECT pg_stat_get_snapshot_timestamp(); SELECT pg_stat_get_function_calls(0); SELECT pg_stat_get_snapshot_timestamp() >= NOW(); -- shows NULL again after clearing -SELECT pg_stat_clear_snapshot(); +SELECT pg_stat_clear_snapshot() IS NOT NULL AS t; SELECT pg_stat_get_snapshot_timestamp(); COMMIT; -- 2.47.1