Add ability to reset all shared stats types in pg_stat_reset_shared()
authorMichael Paquier <[email protected]>
Sun, 12 Nov 2023 07:43:12 +0000 (16:43 +0900)
committerMichael Paquier <[email protected]>
Sun, 12 Nov 2023 07:43:12 +0000 (16:43 +0900)
Currently, pg_stat_reset_shared() can use an argument to specify the
target of statistics to reset, doing nothing for NULL as it is strict.

This patch adds to pg_stat_reset_shared() the possibility to reset all
the stats types already handled in this function rather than do nothing
if the argument value given is NULL or if nothing is specified
(proisstrict is switched to false).  Like previously, SLRUs are not
included in what gets reset.

The idea to use NULL or no argument to control if all the shared stats
already covered by this function should be reset has been proposed by
Andres Freund.

Bump catalog version.

Author: Atsushi Torikoshi
Reviewed-by: Kyotaro Horiguchi, Michael Paquier, Bharath Rupireddy,
Matthias van de Meent
Discussion: https://postgr.es/m/4291a55137ddda77cf7cc5f46e846daf@oss.nttdata.com

doc/src/sgml/monitoring.sgml
src/backend/catalog/system_functions.sql
src/backend/utils/adt/pgstatfuncs.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.dat
src/test/regress/expected/stats.out
src/test/regress/sql/stats.sql

index e068f7e2475b8f0573d5f22f62cd5c22ff7b791f..b8495b649891f95c5f35145505f5e8fabb1908c3 100644 (file)
@@ -4712,7 +4712,7 @@ description | Waiting for a newly initialized WAL file to reach durable storage
         <indexterm>
          <primary>pg_stat_reset_shared</primary>
         </indexterm>
-        <function>pg_stat_reset_shared</function> ( <type>text</type> )
+        <function>pg_stat_reset_shared</function> ( [ <parameter>target</parameter> <type>text</type> <literal>DEFAULT</literal> <literal>NULL</literal> ] )
         <returnvalue>void</returnvalue>
        </para>
        <para>
@@ -4730,6 +4730,9 @@ description | Waiting for a newly initialized WAL file to reach durable storage
         <structname>pg_stat_wal</structname> view or
         <literal>recovery_prefetch</literal> to reset all the counters shown
         in the <structname>pg_stat_recovery_prefetch</structname> view.
+        If <parameter>target</parameter> is <literal>NULL</literal> or
+        is not specified, all the counters from the views listed above are
+        reset.
        </para>
        <para>
         This function is restricted to superusers by default, but other users
index 35d738d5763e2abb25d940fbcf4a7ffcc639b8f5..8079f1cd7ff8270268fd360155bb0652eb879262 100644 (file)
@@ -621,6 +621,13 @@ LANGUAGE internal
 STRICT IMMUTABLE PARALLEL SAFE
 AS 'unicode_is_normalized';
 
+CREATE OR REPLACE FUNCTION
+  pg_stat_reset_shared(target text DEFAULT NULL)
+RETURNS void
+LANGUAGE INTERNAL
+CALLED ON NULL INPUT VOLATILE PARALLEL SAFE
+AS 'pg_stat_reset_shared';
+
 --
 -- The default permissions for functions mean that anyone can execute them.
 -- A number of functions shouldn't be executable by just anyone, but rather
index 1fb8b31863005905af3ca8cafac15a726d7ce632..3a9f9bc4fe155bca7ab5fb108d972f3f2d5c073c 100644 (file)
@@ -1685,7 +1685,22 @@ pg_stat_reset(PG_FUNCTION_ARGS)
 Datum
 pg_stat_reset_shared(PG_FUNCTION_ARGS)
 {
-       char       *target = text_to_cstring(PG_GETARG_TEXT_PP(0));
+       char       *target = NULL;
+
+       if (PG_ARGISNULL(0))
+       {
+               /* Reset all the statistics when nothing is specified */
+               pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER);
+               pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER);
+               pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER);
+               pgstat_reset_of_kind(PGSTAT_KIND_IO);
+               XLogPrefetchResetStats();
+               pgstat_reset_of_kind(PGSTAT_KIND_WAL);
+
+               PG_RETURN_VOID();
+       }
+
+       target = text_to_cstring(PG_GETARG_TEXT_PP(0));
 
        if (strcmp(target, "archiver") == 0)
                pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER);
index bee21befdaba306bb91a8c2f4ca030c3360e5523..ff1f392557874630d8d06af8e4f9afb6b95c55ba 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     202310301
+#define CATALOG_VERSION_NO     202311121
 
 #endif
index f14aed422a765f3c3b6dff82f610c2964855630e..bd0b8873d358e8b46b5741a743d8f62df14c77a6 100644 (file)
   prorettype => 'void', proargtypes => '', prosrc => 'pg_stat_reset' },
 { oid => '3775',
   descr => 'statistics: reset collected statistics shared across the cluster',
-  proname => 'pg_stat_reset_shared', provolatile => 'v', prorettype => 'void',
-  proargtypes => 'text', prosrc => 'pg_stat_reset_shared' },
+  proname => 'pg_stat_reset_shared', proisstrict => 'f', provolatile => 'v',
+  prorettype => 'void', proargtypes => 'text',
+  prosrc => 'pg_stat_reset_shared' },
 { oid => '3776',
   descr => 'statistics: reset collected statistics for a single table or index in the current database or shared across all databases in the cluster',
   proname => 'pg_stat_reset_single_table_counters', provolatile => 'v',
index 494cef07d31cbc9424d42a4926b05afb2536a844..0694de736a0d1cc2a4848ebe6b3c92e494706eba 100644 (file)
@@ -975,38 +975,39 @@ SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
 (1 row)
 
 SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset
--- Test that reset_shared with no specified stats type doesn't reset anything
-SELECT pg_stat_reset_shared(NULL);
+-- Test that reset_shared with no argument resets all the stats types
+-- supported (providing NULL as argument has the same effect).
+SELECT pg_stat_reset_shared();
  pg_stat_reset_shared 
 ----------------------
  
 (1 row)
 
-SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver;
+SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver;
  ?column? 
 ----------
  t
 (1 row)
 
-SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter;
+SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter;
  ?column? 
 ----------
  t
 (1 row)
 
-SELECT stats_reset = :'checkpointer_reset_ts'::timestamptz FROM pg_stat_checkpointer;
+SELECT stats_reset > :'checkpointer_reset_ts'::timestamptz FROM pg_stat_checkpointer;
  ?column? 
 ----------
  t
 (1 row)
 
-SELECT stats_reset = :'recovery_prefetch_reset_ts'::timestamptz FROM pg_stat_recovery_prefetch;
+SELECT stats_reset > :'recovery_prefetch_reset_ts'::timestamptz FROM pg_stat_recovery_prefetch;
  ?column? 
 ----------
  t
 (1 row)
 
-SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
+SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
  ?column? 
 ----------
  t
index 7ae8b8a2762a520b958247a82587becdc3cbe6b9..13db45d4dc419d4ca873d641df24167e6ddbe04a 100644 (file)
@@ -488,13 +488,14 @@ SELECT pg_stat_reset_shared('wal');
 SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
 SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset
 
--- Test that reset_shared with no specified stats type doesn't reset anything
-SELECT pg_stat_reset_shared(NULL);
-SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver;
-SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter;
-SELECT stats_reset = :'checkpointer_reset_ts'::timestamptz FROM pg_stat_checkpointer;
-SELECT stats_reset = :'recovery_prefetch_reset_ts'::timestamptz FROM pg_stat_recovery_prefetch;
-SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
+-- Test that reset_shared with no argument resets all the stats types
+-- supported (providing NULL as argument has the same effect).
+SELECT pg_stat_reset_shared();
+SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver;
+SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter;
+SELECT stats_reset > :'checkpointer_reset_ts'::timestamptz FROM pg_stat_checkpointer;
+SELECT stats_reset > :'recovery_prefetch_reset_ts'::timestamptz FROM pg_stat_recovery_prefetch;
+SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal;
 
 -- Test error case for reset_shared with unknown stats type
 SELECT pg_stat_reset_shared('unknown');