Fix PANIC with track_functions due to concurrent drop of pgstats entries
Michael Paquier <michael@paquier.xyz>
Fix PANIC with track_functions due to concurrent drop of pgstats entries pgstat_drop_entry_internal() generates an ERROR if facing a pgstats entry already marked as dropped. With a workload doing a lot of concurrent CALL and DROP/CREATE PROCEDURE, it could be possible for AtEOXact_PgStat_DroppedStats(), that wants to do transactional drops, to find entries that are already dropped, after a commit record has been written. In this case, ERRORs are upgraded to PANIC, taking down the server. This issue is fixed by making pgstat_drop_entry() optionally more tolerant to concurrent drops, adding to the routine a missing_ok option to make some of its callers more tolerant (spoiler: some of the callers want a strict behavior, like replication slots and backend stats). pgstat_drop_entry_internal() cannot be called anymore for an entry marked as dropped, hence its error is replaced by an assertion. Functions are handled as a special case in core; this problem could also apply to custom stats kinds depending on what an extension does. track_functions is costly when enabled (disabled by default), which is perhaps the main reason why this has not be found yet. A similar version of this patch has been proposed by Sami Imseih on a different thread for a feature in development. This version has tweaked here by me for the sake of fixing this issue. Reported-by: zhanglihui <zlh21343@163.com> Author: Sami Imseih <samimseih@gmail.com> Author: Michael Paquier <michael@paquier.xyz> Reviewed-by: Ayush Tiwari <ayushtiwari.slg01@gmail.com> Discussion: https://postgr.es/m/19520-73873648d44793cf@postgresql.org Backpatch-through: 15
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/utils/activity/pgstat_function.c | modified | +1 −1 |
| src/backend/utils/activity/pgstat_replslot.c | modified | +1 −1 |
| src/backend/utils/activity/pgstat_shmem.c | modified | +19 −8 |
| src/backend/utils/activity/pgstat_xact.c | modified | +4 −4 |
| src/include/utils/pgstat_internal.h | modified | +2 −1 |
Discussion
- BUG #19520: PANIC when concurrently manipulating stored procedures with pg_stat_statements and track_functions = 17 messages · 2026-06-14 → 2026-06-22