From a43ed4295aaafca9ace507a1b36e1bdc13de8659 Mon Sep 17 00:00:00 2001 From: Shinya Kato Date: Fri, 2 May 2025 16:57:23 +0900 Subject: [PATCH v3 6/9] Make pg_stat_reset_slru() return the reset time --- doc/src/sgml/monitoring.sgml | 4 ++-- src/backend/catalog/system_functions.sql | 2 +- src/backend/utils/activity/pgstat_slru.c | 4 +++- src/backend/utils/adt/pgstatfuncs.c | 7 ++++--- src/include/catalog/pg_proc.dat | 2 +- src/include/pgstat.h | 2 +- src/test/regress/expected/stats.out | 16 ++++++++-------- src/test/regress/sql/stats.sql | 4 ++-- 8 files changed, 22 insertions(+), 19 deletions(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 60ece8b02a8..07b7b160987 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -5211,11 +5211,11 @@ description | Waiting for a newly initialized WAL file to reach durable storage pg_stat_reset_slru pg_stat_reset_slru ( [ target text DEFAULT NULL ] ) - void + timestamp with time zone Resets statistics to zero for a single SLRU cache, or for all SLRUs in - the cluster. If target is + the cluster, and returns the time of the reset. If target is NULL or is not specified, all the counters shown in the pg_stat_slru view for all SLRU caches are reset. The argument can be one of diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index 0d679e6a8d4..4039fe5abc8 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -645,7 +645,7 @@ AS 'pg_stat_reset_shared'; CREATE OR REPLACE FUNCTION pg_stat_reset_slru(target text DEFAULT NULL) -RETURNS void +RETURNS timestamp with time zone LANGUAGE INTERNAL CALLED ON NULL INPUT VOLATILE PARALLEL SAFE AS 'pg_stat_reset_slru'; diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index da50f8a0457..89a534048fb 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -41,7 +41,7 @@ static bool have_slrustats = false; * Permission checking for this function is managed through the normal * GRANT system. */ -void +TimestampTz pgstat_reset_slru(const char *name) { TimestampTz ts = GetCurrentTimestamp(); @@ -49,6 +49,8 @@ pgstat_reset_slru(const char *name) Assert(name != NULL); pgstat_reset_slru_counter_internal(pgstat_get_slru_index(name), ts); + + return ts; } /* diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index b3d3d7f027d..cabdbd8303a 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -2002,16 +2002,17 @@ Datum pg_stat_reset_slru(PG_FUNCTION_ARGS) { char *target = NULL; + TimestampTz ts; if (PG_ARGISNULL(0)) - pgstat_reset_of_kind(PGSTAT_KIND_SLRU); + ts = pgstat_reset_of_kind(PGSTAT_KIND_SLRU); else { target = text_to_cstring(PG_GETARG_TEXT_PP(0)); - pgstat_reset_slru(target); + ts = pgstat_reset_slru(target); } - PG_RETURN_VOID(); + PG_RETURN_TIMESTAMPTZ(ts); } /* Reset replication slots stats (a specific one or all of them). */ diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index b05e96c5994..749c8c3ac1c 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -6183,7 +6183,7 @@ { oid => '2307', descr => 'statistics: reset collected statistics for a single SLRU', proname => 'pg_stat_reset_slru', proisstrict => 'f', provolatile => 'v', - prorettype => 'void', proargtypes => 'text', proargnames => '{target}', + prorettype => 'timestamptz', proargtypes => 'text', proargnames => '{target}', prosrc => 'pg_stat_reset_slru' }, { oid => '6170', descr => 'statistics: reset collected statistics for a single replication slot', diff --git a/src/include/pgstat.h b/src/include/pgstat.h index cac2cef060d..11efea568db 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -751,7 +751,7 @@ extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname); * Functions in pgstat_slru.c */ -extern void pgstat_reset_slru(const char *); +extern TimestampTz pgstat_reset_slru(const char *); extern void pgstat_count_slru_blocks_zeroed(int slru_idx); extern void pgstat_count_slru_blocks_hit(int slru_idx); extern void pgstat_count_slru_blocks_read(int slru_idx); diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index f1b6e21533f..c62d8ad26ff 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -1011,10 +1011,10 @@ WHERE pg_stat_get_backend_pid(beid) = pg_backend_pid(); -- Test that reset_slru with a specified SLRU works. SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'notify' \gset -SELECT pg_stat_reset_slru('commit_timestamp'); - pg_stat_reset_slru --------------------- - +SELECT pg_stat_reset_slru('commit_timestamp') IS NOT NULL AS t; + t +--- + t (1 row) SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; @@ -1025,10 +1025,10 @@ SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru W SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function -SELECT pg_stat_reset_slru(); - pg_stat_reset_slru --------------------- - +SELECT pg_stat_reset_slru() IS NOT NULL AS t; + t +--- + t (1 row) SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index a1a9dad0a6a..9e7f1a5fd2f 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -481,12 +481,12 @@ WHERE pg_stat_get_backend_pid(beid) = pg_backend_pid(); -- Test that reset_slru with a specified SLRU works. SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'notify' \gset -SELECT pg_stat_reset_slru('commit_timestamp'); +SELECT pg_stat_reset_slru('commit_timestamp') IS NOT NULL AS t; SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function -SELECT pg_stat_reset_slru(); +SELECT pg_stat_reset_slru() IS NOT NULL AS t; SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'notify'; -- 2.47.3