Re: BUG #19520: PANIC when concurrently manipulating stored procedures with pg_stat_statements and track_functions =
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Sami Imseih <samimseih@gmail.com>
Cc: Ayush Tiwari <ayushtiwari.slg01@gmail.com>, zlh21343@163.com, pgsql-bugs@lists.postgresql.org, Andres Freund <andres@anarazel.de>, Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: 2026-06-18T01:03:40Z
Lists: pgsql-bugs
Attachments
- v2-0001-Fix-potential-PANICs-with-concurrent-drop-of-pgst.patch (text/plain) patch v2-0001
On Wed, Jun 17, 2026 at 03:26:33PM -0500, Sami Imseih wrote: >> Was the idea to leave it as a backstop, or would folding the handling into >> one place (or making _internal's an Assert) be cleaner? > > The check in _internal should be converted to an Assert. This documents > that callers must only pass "live" entries, which will be the case > for all callers after > the patch Yeah, I was hesitating to do so, but perhaps you are right that there is little meaning in keeping this extra elog() anymore in the internal routine: all its callers discard entries marked as dropped. And we do so while holding an exclusive lock. >> - In the missing_ok path the wrapper returns true, so the post-commit >> caller skips the not_freed_count++/GC request that a "real" not-freed >> drop would do. That seems harmless since the entry self-heals >> but was returning true there a deliberate choice over mirroring >> the not-freed/false path? I need to take a look again at this, maybe >> I missed something. > > Finding an already dropped entry tells me that the first caller to drop the > entry also triggered a gc request, so we should not request it again. Nope, we should not trigger multiple requests. Attaching an updated patch for now. I am still testing it locally across all the branches to make sure that the issue is gone (that takes quite a bit of time). I'll probably apply it in a few hours down to v15 if nothing pops up. -- Michael
Commits
-
Re-introduce pgstat_drop_entry(), keeping ABI compatibility
- 9e47718250d8 15 (unreleased) landed
- e34b1ff5d894 16 (unreleased) landed
- afb076b2977c 17 (unreleased) landed
- fe464e9e6863 18 (unreleased) landed
-
Update .abi-compliance-history for pgstat_drop_entry()
- 75aca8b932e8 15 (unreleased) landed
- 7c457ea15c6d 16 (unreleased) landed
- 39e649d44a1d 17 (unreleased) landed
- 8a4f389ddce5 18 (unreleased) landed
-
Fix PANIC with track_functions due to concurrent drop of pgstats entries
- 1e9e62193c3f 15 (unreleased) landed
- bf4616b598a3 16 (unreleased) landed
- 2e0c61aed624 17 (unreleased) landed
- 5cc59834b860 18 (unreleased) landed
- 850b9218c8e4 19 (unreleased) landed