Re: Add pg_stat_autovacuum_priority
Sami Imseih <samimseih@gmail.com>
From: Sami Imseih <samimseih@gmail.com>
To: Nathan Bossart <nathandbossart@gmail.com>
Cc: Andres Freund <andres@anarazel.de>, Tom Lane <tgl@sss.pgh.pa.us>, Alexander Lakhin <exclusion@gmail.com>, Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>,
Robert Treat <rob@xzilla.net>, satyanarlapuram@gmail.com, pgsql-hackers <pgsql-hackers@postgresql.org>, tndrwang@gmail.com
Date: 2026-04-08T23:51:59Z
Lists: pgsql-hackers
Attachments
- v2-0001-Fix-double-free-on-relation_needs_vacanalyze.patch (application/octet-stream) patch v2-0001
> On Wed, Apr 08, 2026 at 04:33:00PM -0500, Sami Imseih wrote: > >> On Wed, Apr 08, 2026 at 04:40:03PM -0400, Andres Freund wrote: > >> > Note that the whole cached state does automatically get reset at the end of > >> > the transaction (AtEOXact_PgStat()->pgstat_clear_snapshot()), just like it did > >> > before the shmem stats stuff. > >> > >> I see a lot of memory used for the pgStatEntryRefHash table, too (e.g., ~16 > >> MB for 100K tables). What's interesting is that I cannot reproduce similar > >> usage with views like pg_stat_all_tables. If memory was not a concern, I > >> think the "bool *may_free" idea would be fine. > > > > Instead of may_free, which is invasive, what about pgstat_fetch_entry_nocache > > which can be called by 2 new APIs pgstat_fetch_stat_tabentry_nocache() and > > pgstat_fetch_stat_tabentry_nocache_ext(). This way a caller that uses > > these will be required to pfree? > > This might help avoid memory usage within a snapshot, Yes, this is exactly why it would be useful for autovacuum workers and the scores view. relation_needs_vacanalyze() can use the nocache variant, and we don't need to have a conditional pfree. What I did not like about this idea after thinking about it more is the performance overhead potentially since every call to the view will take a shared lock on the entries, and the stats will not be consistent when the view is called multiple times in a transaction even when stats_fetch_consistency is NONE. The latter could be a desired feature, but it goes against the users intentions and could be confusing. I went ahead and implemented Andres's idea of will_free. Callers of pgstat_fetch_entry can either pass a NULL to a will_free parameter, or a bool. Callers that pass the bool can check if will_free is true and can choose to free the entry. For now, to keep the changes minimal, I only pgstat_fetch_stat_tabentry_ext() will call pgstat_fetch_entry() with the bool and relation_needs_vacanalyze() will be the only call site that checks this to pfree the entry. There may be some opportunities to improve other call sites if they are indeed leaking. For example, pgstat_copy_relation_stats() could leak with fetch_consistency = NONE. I kept that out for now, but we should probably close that gap in another patch. Also, pgstat_fetch_stat_dbentry() in autovacuum.c could potentially use this, but I did not look into detail. What do you think? -- Sami
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix double-free in pg_stat_autovacuum_scores.
- 71ff232a5bc4 19 (unreleased) landed
-
Add LOG_NEVER error level code.
- 60165db6e1f2 19 (unreleased) landed
-
Add pg_stat_autovacuum_scores system view.
- 87f61f0c8280 19 (unreleased) landed
-
Remove recheck_relation_needs_vacanalyze().
- 775fe51daaef 19 (unreleased) landed
-
Add elevel parameter to relation_needs_vacanalyze().
- 01876ace1369 19 (unreleased) landed
-
Teach relation_needs_vacanalyze() to always compute scores.
- 53b8ca6881a1 19 (unreleased) landed
-
Refactor relation_needs_vacanalyze().
- 8261ee24fe33 19 (unreleased) landed
-
Add rudimentary table prioritization to autovacuum.
- d7965d65fc5b 19 (unreleased) cited
-
Fix per-relation memory leakage in autovacuum.
- 02502c1bca54 18.0 cited
-
Fix recently-understood problems with handling of XID freezing, particularly
- 48188e1621bb 8.2.0 cited