From c28334f588cbe8535bf45e272295a52850b2ff95 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Wed, 27 Dec 2023 16:41:47 -0500 Subject: [PATCH v3 03/12] Add LSNTimeline to PgStat_WalStats Add a globally maintained instance of the new LSNTimeline to PgStat_WalStats and add utility functions for maintaining and accessing it. This commit does not insert new values to the timeline or use the helpers to access it. --- src/backend/utils/activity/pgstat_wal.c | 48 +++++++++++++++++++++---- src/include/pgstat.h | 6 ++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index ba40aad258a..594185acb97 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -36,10 +36,10 @@ static WalUsage prevWalUsage; static void lsntime_absorb(LSNTime *a, const LSNTime *b); -void lsntime_insert(LSNTimeline *timeline, TimestampTz time, XLogRecPtr lsn); +static void lsntime_insert(LSNTimeline *timeline, TimestampTz time, XLogRecPtr lsn); -XLogRecPtr estimate_lsn_at_time(const LSNTimeline *timeline, TimestampTz time); -TimestampTz estimate_time_at_lsn(const LSNTimeline *timeline, XLogRecPtr lsn); +static XLogRecPtr estimate_lsn_at_time(const LSNTimeline *timeline, TimestampTz time); +static TimestampTz estimate_time_at_lsn(const LSNTimeline *timeline, XLogRecPtr lsn); /* * Calculate how much WAL usage counters have increased and update @@ -222,7 +222,7 @@ lsntime_absorb(LSNTime *a, const LSNTime *b) * Insert a new LSNTime into the LSNTimeline in the first element with spare * capacity. */ -void +static void lsntime_insert(LSNTimeline *timeline, TimestampTz time, XLogRecPtr lsn) { @@ -284,7 +284,7 @@ lsntime_insert(LSNTimeline *timeline, TimestampTz time, * Translate time to a LSN using the provided timeline. The timeline will not * be modified. */ -XLogRecPtr +static XLogRecPtr estimate_lsn_at_time(const LSNTimeline *timeline, TimestampTz time) { TimestampTz time_elapsed; @@ -336,7 +336,7 @@ estimate_lsn_at_time(const LSNTimeline *timeline, TimestampTz time) * Translate lsn to a time using the provided timeline. The timeline will not * be modified. */ -TimestampTz +static TimestampTz estimate_time_at_lsn(const LSNTimeline *timeline, XLogRecPtr lsn) { TimestampTz time_elapsed; @@ -383,3 +383,39 @@ estimate_time_at_lsn(const LSNTimeline *timeline, XLogRecPtr lsn) return 0; return result; } + +XLogRecPtr +pgstat_wal_estimate_lsn_at_time(TimestampTz time) +{ + XLogRecPtr result; + PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + result = estimate_lsn_at_time(&stats_shmem->stats.timeline, time); + LWLockRelease(&stats_shmem->lock); + + return result; +} + +TimestampTz +pgstat_wal_estimate_time_at_lsn(XLogRecPtr lsn) +{ + TimestampTz result; + PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; + + LWLockAcquire(&stats_shmem->lock, LW_SHARED); + result = estimate_time_at_lsn(&stats_shmem->stats.timeline, lsn); + LWLockRelease(&stats_shmem->lock); + + return result; +} + +void +pgstat_wal_update_lsntimeline(TimestampTz time, XLogRecPtr lsn) +{ + PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; + + LWLockAcquire(&stats_shmem->lock, LW_EXCLUSIVE); + lsntime_insert(&stats_shmem->stats.timeline, time, lsn); + LWLockRelease(&stats_shmem->lock); +} diff --git a/src/include/pgstat.h b/src/include/pgstat.h index ddbe320bf3e..dd914e606eb 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -472,6 +472,7 @@ typedef struct PgStat_WalStats PgStat_Counter wal_sync; PgStat_Counter wal_write_time; PgStat_Counter wal_sync_time; + LSNTimeline timeline; TimestampTz stat_reset_timestamp; } PgStat_WalStats; @@ -754,6 +755,11 @@ extern void pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_ extern void pgstat_report_wal(bool force); extern PgStat_WalStats *pgstat_fetch_stat_wal(void); +/* Helpers for maintaining the LSNTimeline */ +extern XLogRecPtr pgstat_wal_estimate_lsn_at_time(TimestampTz time); +extern TimestampTz pgstat_wal_estimate_time_at_lsn(XLogRecPtr lsn); +extern void pgstat_wal_update_lsntimeline(TimestampTz time, XLogRecPtr lsn); + /* * Variables in pgstat.c -- 2.37.2