0001-Improve-checkpoint-logging-and-expose-last-checkpoin.patch

application/x-patch

Filename: 0001-Improve-checkpoint-logging-and-expose-last-checkpoin.patch
Type: application/x-patch
Part: 0
Message: Re: [PATCH] Expose checkpoint timestamp and duration in pg_stat_checkpointer
From 5ac32acb618b563f3e8088afe9f026651c820b8b Mon Sep 17 00:00:00 2001
From: BharatDB <bharatdbpg@gmail.com>
Date: Thu, 27 Nov 2025 16:43:00 +0530
Subject: [PATCH] Improve checkpoint logging and expose last checkpoint
 duration in pg_stat_checkpointer

Signed-off-by: BharatDB <bharatdbpg@gmail.com>
---
 src/backend/access/transam/xlog.c             |  2 +-
 src/backend/catalog/system_views.sql          |  6 ++--
 .../utils/activity/pgstat_checkpointer.c      | 32 +++----------------
 src/backend/utils/adt/pgstatfuncs.c           |  8 +++--
 src/include/catalog/pg_proc.dat               |  4 +--
 src/include/pgstat.h                          |  2 +-
 6 files changed, 17 insertions(+), 37 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9217508917..4a45f4f708 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6778,7 +6778,7 @@ LogCheckpointEnd(bool restartpoint, int flags)
 												
 	
 	/* Store in PendingCheckpointerStats */
-	PendingCheckpointerStats.checkpoint_total_time += (double) total_msecs;
+	PendingCheckpointerStats.last_checkpoint_duration = (double) total_msecs;
 	PendingCheckpointerStats.last_checkpoint_time = CheckpointStats.ckpt_end_t;
 
 	/* Publishing it */
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 903e001d95..a90f64494f 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -1190,9 +1190,9 @@ CREATE VIEW pg_stat_checkpointer AS
         pg_stat_get_checkpointer_sync_time() AS sync_time,
         pg_stat_get_checkpointer_buffers_written() AS buffers_written,
         pg_stat_get_checkpointer_slru_written() AS slru_written,
-        pg_stat_get_checkpointer_stat_reset_time() AS stats_reset,
-        pg_stat_get_checkpointer_checkpoint_total_time() AS checkpoint_total_time,
-        pg_stat_get_checkpointer_last_checkpoint_time() AS last_checkpoint_time;
+        pg_stat_get_checkpointer_last_checkpoint_duration() AS last_checkpoint_duration,
+        pg_stat_get_checkpointer_last_checkpoint_time() AS last_checkpoint_time,
+        pg_stat_get_checkpointer_stat_reset_time() AS stats_reset;
 
 CREATE VIEW pg_stat_io AS
 SELECT
diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c
index 62ef427b82..ec51874af7 100644
--- a/src/backend/utils/activity/pgstat_checkpointer.c
+++ b/src/backend/utils/activity/pgstat_checkpointer.c
@@ -56,10 +56,13 @@ pgstat_report_checkpointer(void)
 	CHECKPOINTER_ACC(sync_time);
 	CHECKPOINTER_ACC(buffers_written);
 	CHECKPOINTER_ACC(slru_written);
-	CHECKPOINTER_ACC(checkpoint_total_time);
 #undef CHECKPOINTER_ACC
 
 	/* only overwrite if we actually have a new timestamp */
+	if (PendingCheckpointerStats.last_checkpoint_duration > 0)
+    	stats_shmem->stats.last_checkpoint_duration =
+        	PendingCheckpointerStats.last_checkpoint_duration;
+
 	if (PendingCheckpointerStats.last_checkpoint_time != 0)
     	stats_shmem->stats.last_checkpoint_time =
         	PendingCheckpointerStats.last_checkpoint_time;
@@ -77,28 +80,6 @@ pgstat_report_checkpointer(void)
 	pgstat_flush_io(false);
 }
 
-/* ------------------------------------------------------------
- * Extended checkpointer stats reporting function
- * ------------------------------------------------------------
- */
-void
-pgstat_report_checkpointer_extended(long total_msecs, TimestampTz end_time)
-{
-    
-	PgStat_CheckpointerStats *checkpointer_stats;
-
-
-   checkpointer_stats = pgstat_fetch_stat_checkpointer();
-   if (!checkpointer_stats)
-       return;
-
-
-   checkpointer_stats->checkpoint_total_time += total_msecs;
-   checkpointer_stats->last_checkpoint_time = end_time;
-
-}
-
-
 /*
  * pgstat_fetch_stat_checkpointer() -
  *
@@ -164,11 +145,8 @@ pgstat_checkpointer_snapshot_cb(void)
 	CHECKPOINTER_COMP(sync_time);
 	CHECKPOINTER_COMP(buffers_written);
 	CHECKPOINTER_COMP(slru_written);
-	CHECKPOINTER_COMP(checkpoint_total_time);
+	CHECKPOINTER_COMP(last_checkpoint_duration);
 #undef CHECKPOINTER_COMP
 
 	pgStatLocal.snapshot.checkpointer.last_checkpoint_time = stats_shmem->stats.last_checkpoint_time;
-
-	elog(LOG, "DBG snapshot_cb: copied last_checkpoint_time=%ld",
-    	(long) pgStatLocal.snapshot.checkpointer.last_checkpoint_time);
 }
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 591ad2ac88..57a1853ab1 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -2293,13 +2293,15 @@ pg_stat_have_stats(PG_FUNCTION_ARGS)
 	PG_RETURN_BOOL(pgstat_have_entry(kind, dboid, objid));
 }
 
-PG_FUNCTION_INFO_V1(pg_stat_get_checkpointer_checkpoint_total_time);
+PG_FUNCTION_INFO_V1(pg_stat_get_checkpointer_last_checkpoint_duration);
 
 Datum
-pg_stat_get_checkpointer_checkpoint_total_time(PG_FUNCTION_ARGS)
+pg_stat_get_checkpointer_last_checkpoint_duration(PG_FUNCTION_ARGS)
 {
     PgStat_CheckpointerStats *stats = pgstat_fetch_stat_checkpointer();
-    PG_RETURN_FLOAT8(stats->checkpoint_total_time);
+	if (!stats)
+        PG_RETURN_NULL();
+    PG_RETURN_FLOAT8(stats->last_checkpoint_duration);
 }
 
 PG_FUNCTION_INFO_V1(pg_stat_get_checkpointer_last_checkpoint_time);
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index a57053c4e2..043bf854bc 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -5983,9 +5983,9 @@
 # New functions for checkpointer
 { oid => '7000', 
   descr => 'total time spent in last checkpoint in milliseconds',
-  proname => 'pg_stat_get_checkpointer_checkpoint_total_time', provolatile => 's',
+  proname => 'pg_stat_get_checkpointer_last_checkpoint_duration', provolatile => 's',
   proparallel => 'r', prorettype => 'float8', proargtypes => '',
-  prosrc => 'pg_stat_get_checkpointer_checkpoint_total_time' },
+  prosrc => 'pg_stat_get_checkpointer_last_checkpoint_duration' },
 { oid => '7001', 
   descr => 'timestamp of last checkpoint completion',
   proname => 'pg_stat_get_checkpointer_last_checkpoint_time', provolatile => 's', 
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index a8eb1f8add..73688041c8 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -263,7 +263,7 @@ typedef struct PgStat_CheckpointerStats
 	PgStat_Counter sync_time;
 	PgStat_Counter buffers_written;
 	PgStat_Counter slru_written;
-	PgStat_Counter checkpoint_total_time;  /* new: total ms of last checkpoint */
+	PgStat_Counter last_checkpoint_duration;  /* new: total ms of last checkpoint */
 	TimestampTz    last_checkpoint_time;   /* new: end time of last checkpoint */
 	TimestampTz    stat_reset_timestamp;
 } PgStat_CheckpointerStats;
-- 
2.34.1