Rename column slotsync_skip_at to slotsync_last_skip.
authorAmit Kapila <akapila@postgresql.org>
Fri, 5 Dec 2025 04:12:55 +0000 (04:12 +0000)
committerAmit Kapila <akapila@postgresql.org>
Fri, 5 Dec 2025 04:12:55 +0000 (04:12 +0000)
Commit 76b78721ca introduced two new columns in pg_stat_replication_slots
to improve monitoring of slot synchronization. One of these columns was
named slotsync_skip_at, which is inconsistent with the naming convention
used for similar columns in other system views.

Columns that store timestamps of the most recent event typically use the
'last_' in the column name (e.g., last_autovacuum, checksum_last_failure).
Renaming slotsync_skip_at to slotsync_last_skip aligns with this pattern,
making the purpose of the column clearer and improving overall consistency
across the views.

Author: Shlok Kyal <shlok.kyal.oss@gmail.com>
Reviewed-by: Michael Banck <mbanck@gmx.net>
Discussion: https://postgr.es/m/20251128091552.GB13635@p46.dedyn.io;lightning.p46.dedyn.io
Discussion: https://postgr.es/m/CAE9k0PkhfKrTEAsGz4DjOhEj1nQ+hbQVfvWUxNacD38ibW3a1g@mail.gmail.com

contrib/test_decoding/expected/stats.out
doc/src/sgml/monitoring.sgml
src/backend/catalog/system_views.sql
src/backend/utils/activity/pgstat_replslot.c
src/backend/utils/adt/pgstatfuncs.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.dat
src/include/pgstat.h
src/test/regress/expected/rules.out

index e5117f88a146588f32aee8d9accdc0467198b539..a9ead3c41aa31f43a12d6460ed9e040e1df6b7d1 100644 (file)
@@ -78,17 +78,17 @@ SELECT slot_name, spill_txns = 0 AS spill_txns, spill_count = 0 AS spill_count,
 
 -- verify accessing/resetting stats for non-existent slot does something reasonable
 SELECT * FROM pg_stat_get_replication_slot('do-not-exist');
-  slot_name   | spill_txns | spill_count | spill_bytes | stream_txns | stream_count | stream_bytes | mem_exceeded_count | total_txns | total_bytes | slotsync_skip_count | slotsync_skip_at | stats_reset 
---------------+------------+-------------+-------------+-------------+--------------+--------------+--------------------+------------+-------------+---------------------+------------------+-------------
- do-not-exist |          0 |           0 |           0 |           0 |            0 |            0 |                  0 |          0 |           0 |                   0 |                  | 
+  slot_name   | spill_txns | spill_count | spill_bytes | stream_txns | stream_count | stream_bytes | mem_exceeded_count | total_txns | total_bytes | slotsync_skip_count | slotsync_last_skip | stats_reset 
+--------------+------------+-------------+-------------+-------------+--------------+--------------+--------------------+------------+-------------+---------------------+--------------------+-------------
+ do-not-exist |          0 |           0 |           0 |           0 |            0 |            0 |                  0 |          0 |           0 |                   0 |                    
 (1 row)
 
 SELECT pg_stat_reset_replication_slot('do-not-exist');
 ERROR:  replication slot "do-not-exist" does not exist
 SELECT * FROM pg_stat_get_replication_slot('do-not-exist');
-  slot_name   | spill_txns | spill_count | spill_bytes | stream_txns | stream_count | stream_bytes | mem_exceeded_count | total_txns | total_bytes | slotsync_skip_count | slotsync_skip_at | stats_reset 
---------------+------------+-------------+-------------+-------------+--------------+--------------+--------------------+------------+-------------+---------------------+------------------+-------------
- do-not-exist |          0 |           0 |           0 |           0 |            0 |            0 |                  0 |          0 |           0 |                   0 |                  | 
+  slot_name   | spill_txns | spill_count | spill_bytes | stream_txns | stream_count | stream_bytes | mem_exceeded_count | total_txns | total_bytes | slotsync_skip_count | slotsync_last_skip | stats_reset 
+--------------+------------+-------------+-------------+-------------+--------------+--------------+--------------------+------------+-------------+---------------------+--------------------+-------------
+ do-not-exist |          0 |           0 |           0 |           0 |            0 |            0 |                  0 |          0 |           0 |                   0 |                    
 (1 row)
 
 -- spilling the xact
index 039d73691be10fb7bb26d75ebfe649438e60e685..d2dd5e2836587e4a5f2d1f59d6eab099ee73b892 100644 (file)
@@ -1671,7 +1671,7 @@ description | Waiting for a newly initialized WAL file to reach durable storage
 
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
-        <structfield>slotsync_skip_at</structfield><type>timestamp with time zone</type>
+        <structfield>slotsync_last_skip</structfield><type>timestamp with time zone</type>
        </para>
        <para>
         Time at which last slot synchronization was skipped. Slot
index 086c4c8fb6ff6f74e4e32abc9bae7abbb45c60a1..48af8ee90a6d5ad569a9595000b6c4781ddce185 100644 (file)
@@ -1078,7 +1078,7 @@ CREATE VIEW pg_stat_replication_slots AS
             s.total_txns,
             s.total_bytes,
             s.slotsync_skip_count,
-            s.slotsync_skip_at,
+            s.slotsync_last_skip,
             s.stats_reset
     FROM pg_replication_slots as r,
         LATERAL pg_stat_get_replication_slot(slot_name) as s
index e08d33e8b4c191ee4b16c461713f0228fb81bee5..d757e00eb54dd7f5e9ab55df4ce6e4c92dd0ce96 100644 (file)
@@ -127,7 +127,7 @@ pgstat_report_replslotsync(ReplicationSlot *slot)
    statent = &shstatent->stats;
 
    statent->slotsync_skip_count += 1;
-   statent->slotsync_skip_at = GetCurrentTimestamp();
+   statent->slotsync_last_skip = GetCurrentTimestamp();
 
    pgstat_unlock_entry(entry_ref);
 }
index 7e2ed69138aa225564e32bf700c186cb1c9ecbca..ef6fffe60b97a19268db812e33289c4649f1e18c 100644 (file)
@@ -2162,7 +2162,7 @@ pg_stat_get_replication_slot(PG_FUNCTION_ARGS)
                       INT8OID, -1, 0);
    TupleDescInitEntry(tupdesc, (AttrNumber) 11, "slotsync_skip_count",
                       INT8OID, -1, 0);
-   TupleDescInitEntry(tupdesc, (AttrNumber) 12, "slotsync_skip_at",
+   TupleDescInitEntry(tupdesc, (AttrNumber) 12, "slotsync_last_skip",
                       TIMESTAMPTZOID, -1, 0);
    TupleDescInitEntry(tupdesc, (AttrNumber) 13, "stats_reset",
                       TIMESTAMPTZOID, -1, 0);
@@ -2192,10 +2192,10 @@ pg_stat_get_replication_slot(PG_FUNCTION_ARGS)
    values[9] = Int64GetDatum(slotent->total_bytes);
    values[10] = Int64GetDatum(slotent->slotsync_skip_count);
 
-   if (slotent->slotsync_skip_at == 0)
+   if (slotent->slotsync_last_skip == 0)
        nulls[11] = true;
    else
-       values[11] = TimestampTzGetDatum(slotent->slotsync_skip_at);
+       values[11] = TimestampTzGetDatum(slotent->slotsync_last_skip);
 
    if (slotent->stat_reset_timestamp == 0)
        nulls[12] = true;
index 70320aa0cfb06d5018ca6344435326873269bd4c..d13ed62af46f7a722c1ca5a7f941a35cc64e3d59 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 202511281
+#define CATALOG_VERSION_NO 202512051
 
 #endif
index 66af2d96d67c51d33141ae2a5e7ac197fe4fcf53..fd9448ec7b980a067ec7d3c09b10d1f1f83a5b94 100644 (file)
   proparallel => 'r', prorettype => 'record', proargtypes => 'text',
   proallargtypes => '{text,text,int8,int8,int8,int8,int8,int8,int8,int8,int8,int8,timestamptz,timestamptz}',
   proargmodes => '{i,o,o,o,o,o,o,o,o,o,o,o,o,o}',
-  proargnames => '{slot_name,slot_name,spill_txns,spill_count,spill_bytes,stream_txns,stream_count,stream_bytes,mem_exceeded_count,total_txns,total_bytes,slotsync_skip_count,slotsync_skip_at,stats_reset}',
+  proargnames => '{slot_name,slot_name,spill_txns,spill_count,spill_bytes,stream_txns,stream_count,stream_bytes,mem_exceeded_count,total_txns,total_bytes,slotsync_skip_count,slotsync_last_skip,stats_reset}',
   prosrc => 'pg_stat_get_replication_slot' },
 
 { oid => '6230', descr => 'statistics: check if a stats object exists',
index ad85134f27a3e641e212e36bf7dd1c945ce526f3..f23dd5870da7807ff28011943c2e3733e40d8369 100644 (file)
@@ -401,7 +401,7 @@ typedef struct PgStat_StatReplSlotEntry
    PgStat_Counter total_txns;
    PgStat_Counter total_bytes;
    PgStat_Counter slotsync_skip_count;
-   TimestampTz slotsync_skip_at;
+   TimestampTz slotsync_last_skip;
    TimestampTz stat_reset_timestamp;
 } PgStat_StatReplSlotEntry;
 
index 94e45dd4d5721f93c027845a54c4ded17ab9ff68..85d795dbd63b958ec3c72b1880757c1a8ec69d8e 100644 (file)
@@ -2153,10 +2153,10 @@ pg_stat_replication_slots| SELECT s.slot_name,
     s.total_txns,
     s.total_bytes,
     s.slotsync_skip_count,
-    s.slotsync_skip_at,
+    s.slotsync_last_skip,
     s.stats_reset
    FROM pg_replication_slots r,
-    LATERAL pg_stat_get_replication_slot((r.slot_name)::text) s(slot_name, spill_txns, spill_count, spill_bytes, stream_txns, stream_count, stream_bytes, mem_exceeded_count, total_txns, total_bytes, slotsync_skip_count, slotsync_skip_at, stats_reset)
+    LATERAL pg_stat_get_replication_slot((r.slot_name)::text) s(slot_name, spill_txns, spill_count, spill_bytes, stream_txns, stream_count, stream_bytes, mem_exceeded_count, total_txns, total_bytes, slotsync_skip_count, slotsync_last_skip, stats_reset)
   WHERE (r.datoid IS NOT NULL);
 pg_stat_slru| SELECT name,
     blks_zeroed,