From: Michael Paquier Date: Fri, 31 Jan 2025 03:27:19 +0000 (+0900) Subject: Add pgstat_drop_matching_entries() to pgstats X-Git-Tag: REL_18_BETA1~978 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=ce5c620fb6252dca00d3856d5f09d56c7f1215d0;p=postgresql.git Add pgstat_drop_matching_entries() to pgstats This allows users of the cumulative statistics to drop entries in the shared hash stats table, deleting as well local references. Callers of this function can optionally define a callback able to filter which entries to drop, similarly to pgstat_reset_matching_entries() with its callback do_reset(). pgstat_drop_all_entries() is refactored so as it uses this new function. Author: Lukas Fitti Discussion: https://postgr.es/m/CAP53PkwuFbo3NkwZgxwNRMjMfqPEqidD-SggaoQ4ijotBVLJAA@mail.gmail.com --- diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 342586397d6..770d62425c5 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -993,19 +993,39 @@ pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid) return freed; } +/* + * Scan through the shared hashtable of stats, dropping statistics if + * approved by the optional do_drop() function. + */ void -pgstat_drop_all_entries(void) +pgstat_drop_matching_entries(bool (*do_drop) (PgStatShared_HashEntry *, Datum), + Datum match_data) { dshash_seq_status hstat; PgStatShared_HashEntry *ps; uint64 not_freed_count = 0; + /* entries are removed, take an exclusive lock */ dshash_seq_init(&hstat, pgStatLocal.shared_hash, true); while ((ps = dshash_seq_next(&hstat)) != NULL) { if (ps->dropped) continue; + if (do_drop != NULL && !do_drop(ps, match_data)) + 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++; } @@ -1015,6 +1035,15 @@ pgstat_drop_all_entries(void) pgstat_request_entry_refs_gc(); } +/* + * Scan through the shared hashtable of stats and drop all entries. + */ +void +pgstat_drop_all_entries(void) +{ + pgstat_drop_matching_entries(NULL, 0); +} + 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 a3d39d2b725..06dcea3f0dc 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -718,6 +718,8 @@ 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_matching_entries(bool (*do_drop) (PgStatShared_HashEntry *, Datum), + Datum match_data); 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);