diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index de0bbbfa79..1e2eea0d69 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -504,7 +504,6 @@ CheckpointerMain(void) /* Report pending statistics to the cumulative stats system */ pgstat_report_checkpointer(); - pgstat_report_wal(true); /* * If any checkpoint flags have been set, redo the loop to handle the @@ -582,7 +581,6 @@ HandleCheckpointerInterrupts(void) PendingCheckpointerStats.requested_checkpoints++; ShutdownXLOG(0, 0); pgstat_report_checkpointer(); - pgstat_report_wal(true); /* Normal exit from the checkpointer is here */ proc_exit(0); /* done */ diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index 3e9ab45103..d9ff536404 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -24,10 +24,22 @@ PgStat_CheckpointerStats PendingCheckpointerStats = {0}; /* - * Report checkpointer statistics + * Report checkpointer statistics along with + * wal and slru statistics */ void pgstat_report_checkpointer(void) +{ + pgstat_flush_checkpointer(); + pgstat_report_wal(true); + pgstat_report_slru(); +} + +/* + * Flush out locally pending checkpointer stats + */ +void +pgstat_flush_checkpointer(void) { /* We assume this initializes to zeroes */ static const PgStat_CheckpointerStats all_zeroes; diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 1b16740f39..8da5b2b3e2 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -35,6 +35,19 @@ static PgStat_SLRUStats pending_SLRUStats[SLRU_NUM_ELEMENTS]; bool have_slrustats = false; +/* + * Calculate how much SLRU usage counters have increased and update + * shared statistics. + * + * Must be called by processes that interact with SLRU caches, that + * do not call pgstat_report_stat(), like checkpointer. + */ +void +pgstat_report_slru(void) +{ + pgstat_slru_flush(true); +} + /* * Reset counters for a single SLRU. * diff --git a/src/include/pgstat.h b/src/include/pgstat.h index d3e965d744..d2dbc5dcb1 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -592,6 +592,7 @@ extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname); * Functions in pgstat_slru.c */ +extern void pgstat_report_slru(void); extern void pgstat_reset_slru(const char *); extern void pgstat_count_slru_page_zeroed(int slru_idx); extern void pgstat_count_slru_page_hit(int slru_idx); diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 08412d6404..6e688e5ace 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -526,6 +526,7 @@ extern void pgstat_bgwriter_snapshot_cb(void); extern void pgstat_checkpointer_reset_all_cb(TimestampTz ts); extern void pgstat_checkpointer_snapshot_cb(void); +extern void pgstat_flush_checkpointer(void); /* diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 1d84407a03..a7c009383f 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -783,11 +783,14 @@ SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELEC (1 row) -- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal +-- and pg_stat_slru SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset -- Test pg_stat_wal (and make a temp table so our temp schema exists) SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset CREATE TEMP TABLE test_stats_temp AS SELECT 17; DROP TABLE test_stats_temp; +-- Test pg_stat_slru, checkpoint should generate SLRU flushes +SELECT SUM(flushes) AS slru_flushes_before from pg_stat_slru \gset -- Checkpoint twice: The checkpointer reports stats after reporting completion -- of the checkpoint. But after a second checkpoint we'll see at least the -- results of the first. @@ -805,6 +808,12 @@ SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal; t (1 row) +SELECT SUM(flushes) > :slru_flushes_before FROM pg_stat_slru; + ?column? +---------- + t +(1 row) + -- Test pg_stat_get_backend_idset() and some allied functions. -- In particular, verify that their notion of backend ID matches -- our temp schema index. diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index b4d6753c71..cb1173f7ae 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -388,6 +388,7 @@ SELECT pg_stat_force_next_flush(); SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()); -- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal +-- and pg_stat_slru SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset -- Test pg_stat_wal (and make a temp table so our temp schema exists) @@ -396,6 +397,9 @@ SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset CREATE TEMP TABLE test_stats_temp AS SELECT 17; DROP TABLE test_stats_temp; +-- Test pg_stat_slru, checkpoint should generate SLRU flushes +SELECT SUM(flushes) AS slru_flushes_before from pg_stat_slru \gset + -- Checkpoint twice: The checkpointer reports stats after reporting completion -- of the checkpoint. But after a second checkpoint we'll see at least the -- results of the first. @@ -404,6 +408,7 @@ CHECKPOINT; SELECT checkpoints_req > :rqst_ckpts_before FROM pg_stat_bgwriter; SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal; +SELECT SUM(flushes) > :slru_flushes_before FROM pg_stat_slru; -- Test pg_stat_get_backend_idset() and some allied functions. -- In particular, verify that their notion of backend ID matches