diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/activity/pgstat.c | 63 | ||||
-rw-r--r-- | src/backend/utils/activity/pgstat_io.c | 22 | ||||
-rw-r--r-- | src/backend/utils/activity/pgstat_slru.c | 13 | ||||
-rw-r--r-- | src/backend/utils/activity/pgstat_wal.c | 19 | ||||
-rw-r--r-- | src/include/utils/pgstat_internal.h | 42 |
5 files changed, 119 insertions, 40 deletions
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 178b5ef65aa..a7f2dfc744c 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -411,6 +411,8 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE] .shared_data_off = offsetof(PgStatShared_IO, stats), .shared_data_len = sizeof(((PgStatShared_IO *) 0)->stats), + .flush_fixed_cb = pgstat_io_flush_cb, + .have_fixed_pending_cb = pgstat_io_have_pending_cb, .init_shmem_cb = pgstat_io_init_shmem_cb, .reset_all_cb = pgstat_io_reset_all_cb, .snapshot_cb = pgstat_io_snapshot_cb, @@ -426,6 +428,8 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE] .shared_data_off = offsetof(PgStatShared_SLRU, stats), .shared_data_len = sizeof(((PgStatShared_SLRU *) 0)->stats), + .flush_fixed_cb = pgstat_slru_flush_cb, + .have_fixed_pending_cb = pgstat_slru_have_pending_cb, .init_shmem_cb = pgstat_slru_init_shmem_cb, .reset_all_cb = pgstat_slru_reset_all_cb, .snapshot_cb = pgstat_slru_snapshot_cb, @@ -442,6 +446,8 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE] .shared_data_len = sizeof(((PgStatShared_Wal *) 0)->stats), .init_backend_cb = pgstat_wal_init_backend_cb, + .flush_fixed_cb = pgstat_wal_flush_cb, + .have_fixed_pending_cb = pgstat_wal_have_pending_cb, .init_shmem_cb = pgstat_wal_init_shmem_cb, .reset_all_cb = pgstat_wal_reset_all_cb, .snapshot_cb = pgstat_wal_snapshot_cb, @@ -671,13 +677,37 @@ pgstat_report_stat(bool force) } /* Don't expend a clock check if nothing to do */ - if (dlist_is_empty(&pgStatPending) && - !have_iostats && - !have_slrustats && - !pgstat_have_pending_wal()) + if (dlist_is_empty(&pgStatPending)) { - Assert(pending_since == 0); - return 0; + bool do_flush = false; + + /* Check for pending fixed-numbered stats */ + for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++) + { + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); + + if (!kind_info) + continue; + if (!kind_info->fixed_amount) + { + Assert(kind_info->have_fixed_pending_cb == NULL); + continue; + } + if (!kind_info->have_fixed_pending_cb) + continue; + + if (kind_info->have_fixed_pending_cb()) + { + do_flush = true; + break; + } + } + + if (!do_flush) + { + Assert(pending_since == 0); + return 0; + } } /* @@ -730,14 +760,23 @@ pgstat_report_stat(bool force) /* flush database / relation / function / ... stats */ partial_flush |= pgstat_flush_pending_entries(nowait); - /* flush IO stats */ - partial_flush |= pgstat_flush_io(nowait); + /* flush of fixed-numbered stats */ + for (PgStat_Kind kind = PGSTAT_KIND_MIN; kind <= PGSTAT_KIND_MAX; kind++) + { + const PgStat_KindInfo *kind_info = pgstat_get_kind_info(kind); - /* flush wal stats */ - partial_flush |= pgstat_flush_wal(nowait); + if (!kind_info) + continue; + if (!kind_info->fixed_amount) + { + Assert(kind_info->flush_fixed_cb == NULL); + continue; + } + if (!kind_info->flush_fixed_cb) + continue; - /* flush SLRU stats */ - partial_flush |= pgstat_slru_flush(nowait); + partial_flush |= kind_info->flush_fixed_cb(nowait); + } last_flush = now; diff --git a/src/backend/utils/activity/pgstat_io.c b/src/backend/utils/activity/pgstat_io.c index 8af55989eed..cc2ffc78aa9 100644 --- a/src/backend/utils/activity/pgstat_io.c +++ b/src/backend/utils/activity/pgstat_io.c @@ -29,7 +29,7 @@ typedef struct PgStat_PendingIO static PgStat_PendingIO PendingIOStats; -bool have_iostats = false; +static bool have_iostats = false; /* @@ -162,6 +162,24 @@ pgstat_fetch_stat_io(void) } /* + * Check if there any IO stats waiting for flush. + */ +bool +pgstat_io_have_pending_cb(void) +{ + return have_iostats; +} + +/* + * Simpler wrapper of pgstat_io_flush_cb() + */ +void +pgstat_flush_io(bool nowait) +{ + (void) pgstat_io_flush_cb(nowait); +} + +/* * Flush out locally pending IO statistics * * If no stats have been recorded, this function returns false. @@ -170,7 +188,7 @@ pgstat_fetch_stat_io(void) * acquired. Otherwise, return false. */ bool -pgstat_flush_io(bool nowait) +pgstat_io_flush_cb(bool nowait) { LWLock *bktype_lock; PgStat_BktypeIO *bktype_shstats; diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 6f922a85bfc..dd6f9f840e7 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -32,7 +32,7 @@ static void pgstat_reset_slru_counter_internal(int index, TimestampTz ts); * in order to avoid memory allocation. */ static PgStat_SLRUStats pending_SLRUStats[SLRU_NUM_ELEMENTS]; -bool have_slrustats = false; +static bool have_slrustats = false; /* @@ -144,6 +144,15 @@ pgstat_get_slru_index(const char *name) } /* + * Check if there are any SLRU stats entries waiting for flush. + */ +bool +pgstat_slru_have_pending_cb(void) +{ + return have_slrustats; +} + +/* * Flush out locally pending SLRU stats entries * * If nowait is true, this function returns false on lock failure. Otherwise @@ -153,7 +162,7 @@ pgstat_get_slru_index(const char *name) * acquired. Otherwise return false. */ bool -pgstat_slru_flush(bool nowait) +pgstat_slru_flush_cb(bool nowait) { PgStatShared_SLRU *stats_shmem = &pgStatLocal.shmem->slru; int i; diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index 8c19c3f2fd5..e1d371ba3cd 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -72,6 +72,15 @@ pgstat_fetch_stat_wal(void) } /* + * Simple wrapper of pgstat_wal_flush_cb() + */ +void +pgstat_flush_wal(bool nowait) +{ + (void) pgstat_wal_flush_cb(nowait); +} + +/* * Calculate how much WAL usage counters have increased by subtracting the * previous counters from the current ones. * @@ -79,7 +88,7 @@ pgstat_fetch_stat_wal(void) * acquired. Otherwise return false. */ bool -pgstat_flush_wal(bool nowait) +pgstat_wal_flush_cb(bool nowait) { PgStatShared_Wal *stats_shmem = &pgStatLocal.shmem->wal; WalUsage wal_usage_diff = {0}; @@ -92,7 +101,7 @@ pgstat_flush_wal(bool nowait) * This function can be called even if nothing at all has happened. Avoid * taking lock for nothing in that case. */ - if (!pgstat_have_pending_wal()) + if (!pgstat_wal_have_pending_cb()) return false; /* @@ -141,8 +150,8 @@ void pgstat_wal_init_backend_cb(void) { /* - * Initialize prevWalUsage with pgWalUsage so that pgstat_flush_wal() can - * calculate how much pgWalUsage counters are increased by subtracting + * Initialize prevWalUsage with pgWalUsage so that pgstat_wal_flush_cb() + * can calculate how much pgWalUsage counters are increased by subtracting * prevWalUsage from pgWalUsage. */ prevWalUsage = pgWalUsage; @@ -156,7 +165,7 @@ pgstat_wal_init_backend_cb(void) * data pages. */ bool -pgstat_have_pending_wal(void) +pgstat_wal_have_pending_cb(void) { return pgWalUsage.wal_records != prevWalUsage.wal_records || PendingWalStats.wal_write != 0 || diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 25820cbf0a6..bba90e898dd 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -237,7 +237,7 @@ typedef struct PgStat_KindInfo /* * For variable-numbered stats: flush pending stats. Required if pending - * data is used. + * data is used. See flush_fixed_cb for fixed-numbered stats. */ bool (*flush_pending_cb) (PgStat_EntryRef *sr, bool nowait); @@ -266,6 +266,19 @@ typedef struct PgStat_KindInfo void (*init_shmem_cb) (void *stats); /* + * For fixed-numbered statistics: Flush pending stats. Returns true if + * some of the stats could not be flushed, due to lock contention for + * example. Optional. + */ + bool (*flush_fixed_cb) (bool nowait); + + /* + * For fixed-numbered statistics: Check for pending stats in need of + * flush. Returns true if there are any stats pending for flush. Optional. + */ + bool (*have_fixed_pending_cb) (void); + + /* * For fixed-numbered statistics: Reset All. */ void (*reset_all_cb) (TimestampTz ts); @@ -609,7 +622,10 @@ extern bool pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); * Functions in pgstat_io.c */ -extern bool pgstat_flush_io(bool nowait); +extern void pgstat_flush_io(bool nowait); + +extern bool pgstat_io_have_pending_cb(void); +extern bool pgstat_io_flush_cb(bool nowait); extern void pgstat_io_init_shmem_cb(void *stats); extern void pgstat_io_reset_all_cb(TimestampTz ts); extern void pgstat_io_snapshot_cb(void); @@ -668,7 +684,8 @@ extern PgStatShared_Common *pgstat_init_entry(PgStat_Kind kind, * Functions in pgstat_slru.c */ -extern bool pgstat_slru_flush(bool nowait); +extern bool pgstat_slru_have_pending_cb(void); +extern bool pgstat_slru_flush_cb(bool nowait); extern void pgstat_slru_init_shmem_cb(void *stats); extern void pgstat_slru_reset_all_cb(TimestampTz ts); extern void pgstat_slru_snapshot_cb(void); @@ -678,10 +695,11 @@ extern void pgstat_slru_snapshot_cb(void); * Functions in pgstat_wal.c */ -extern bool pgstat_flush_wal(bool nowait); -extern bool pgstat_have_pending_wal(void); +extern void pgstat_flush_wal(bool nowait); extern void pgstat_wal_init_backend_cb(void); +extern bool pgstat_wal_have_pending_cb(void); +extern bool pgstat_wal_flush_cb(bool nowait); extern void pgstat_wal_init_shmem_cb(void *stats); extern void pgstat_wal_reset_all_cb(TimestampTz ts); extern void pgstat_wal_snapshot_cb(void); @@ -712,20 +730,6 @@ extern PGDLLIMPORT PgStat_LocalState pgStatLocal; /* - * Variables in pgstat_io.c - */ - -extern PGDLLIMPORT bool have_iostats; - - -/* - * Variables in pgstat_slru.c - */ - -extern PGDLLIMPORT bool have_slrustats; - - -/* * Implementation of inline functions declared above. */ |