mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
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
This commit is contained in:
@ -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)
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user