From d61a9c94325f980c76d548be6db6f6e86f96e0cd Mon Sep 17 00:00:00 2001 From: Lukas Fittl Date: Thu, 2 Jan 2025 10:46:30 -0800 Subject: [PATCH 2/4] Cumulative statistics: Add pgstat_drop_entries_of_kind helper This allows users of the cumulative statistics systems to drop all entries for a given kind, similar to how pgstat_reset_entries_of_kind allows resetting all entreis for a given statistics kind. --- src/backend/utils/activity/pgstat_shmem.c | 33 +++++++++++++++++++++++ src/include/utils/pgstat_internal.h | 1 + 2 files changed, 34 insertions(+) diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index bcc8b2eb4f..43f2dfd695 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -1015,6 +1015,39 @@ pgstat_drop_all_entries(void) pgstat_request_entry_refs_gc(); } +void +pgstat_drop_entries_of_kind(PgStat_Kind kind) +{ + dshash_seq_status hstat; + PgStatShared_HashEntry *ps; + uint64 not_freed_count = 0; + + dshash_seq_init(&hstat, pgStatLocal.shared_hash, true); + while ((ps = dshash_seq_next(&hstat)) != NULL) + { + if (ps->dropped || ps->key.kind != kind) + continue; + + /* delete local reference */ + if (pgStatEntryRefHash) + { + PgStat_EntryRefHashEntry *lohashent = + pgstat_entry_ref_hash_lookup(pgStatEntryRefHash, ps->key); + + if (lohashent) + pgstat_release_entry_ref(lohashent->key, lohashent->entry_ref, + true); + } + + if (!pgstat_drop_entry_internal(ps, &hstat)) + not_freed_count++; + } + dshash_seq_term(&hstat); + + if (not_freed_count > 0) + pgstat_request_entry_refs_gc(); +} + static void shared_stat_reset_contents(PgStat_Kind kind, PgStatShared_Common *header, TimestampTz ts) diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 811ed9b005..900f71c033 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -707,6 +707,7 @@ extern bool pgstat_lock_entry_shared(PgStat_EntryRef *entry_ref, bool nowait); extern void pgstat_unlock_entry(PgStat_EntryRef *entry_ref); extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid); extern void pgstat_drop_all_entries(void); +extern void pgstat_drop_entries_of_kind(PgStat_Kind kind); extern PgStat_EntryRef *pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, uint64 objid, bool nowait); extern void pgstat_reset_entry(PgStat_Kind kind, Oid dboid, uint64 objid, TimestampTz ts); -- 2.47.1