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;
|
return freed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scan through the shared hashtable of stats, dropping statistics if
|
||||||
|
* approved by the optional do_drop() function.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
pgstat_drop_all_entries(void)
|
pgstat_drop_matching_entries(bool (*do_drop) (PgStatShared_HashEntry *, Datum),
|
||||||
|
Datum match_data)
|
||||||
{
|
{
|
||||||
dshash_seq_status hstat;
|
dshash_seq_status hstat;
|
||||||
PgStatShared_HashEntry *ps;
|
PgStatShared_HashEntry *ps;
|
||||||
uint64 not_freed_count = 0;
|
uint64 not_freed_count = 0;
|
||||||
|
|
||||||
|
/* entries are removed, take an exclusive lock */
|
||||||
dshash_seq_init(&hstat, pgStatLocal.shared_hash, true);
|
dshash_seq_init(&hstat, pgStatLocal.shared_hash, true);
|
||||||
while ((ps = dshash_seq_next(&hstat)) != NULL)
|
while ((ps = dshash_seq_next(&hstat)) != NULL)
|
||||||
{
|
{
|
||||||
if (ps->dropped)
|
if (ps->dropped)
|
||||||
continue;
|
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))
|
if (!pgstat_drop_entry_internal(ps, &hstat))
|
||||||
not_freed_count++;
|
not_freed_count++;
|
||||||
}
|
}
|
||||||
@ -1015,6 +1035,15 @@ pgstat_drop_all_entries(void)
|
|||||||
pgstat_request_entry_refs_gc();
|
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
|
static void
|
||||||
shared_stat_reset_contents(PgStat_Kind kind, PgStatShared_Common *header,
|
shared_stat_reset_contents(PgStat_Kind kind, PgStatShared_Common *header,
|
||||||
TimestampTz ts)
|
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 void pgstat_unlock_entry(PgStat_EntryRef *entry_ref);
|
||||||
extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid);
|
extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid);
|
||||||
extern void pgstat_drop_all_entries(void);
|
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,
|
extern PgStat_EntryRef *pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, uint64 objid,
|
||||||
bool nowait);
|
bool nowait);
|
||||||
extern void pgstat_reset_entry(PgStat_Kind kind, Oid dboid, uint64 objid, TimestampTz ts);
|
extern void pgstat_reset_entry(PgStat_Kind kind, Oid dboid, uint64 objid, TimestampTz ts);
|
||||||
|
Reference in New Issue
Block a user