Prevent inconsistent use of stats entry for replication slots
authorMichael Paquier
Wed, 5 Jun 2024 23:47:40 +0000 (08:47 +0900)
committerMichael Paquier
Wed, 5 Jun 2024 23:47:40 +0000 (08:47 +0900)
commitcd312adc561a0de056bbc0b0087d275bd3e9f282
tree6cae986dfe08f5465c1cc2ae9d09ed735571cd8a
parent8111e80c5d39451c0cbff91d5a6b69fd87c3928c
Prevent inconsistent use of stats entry for replication slots

Concurrent activity around replication slot creation and drop could
cause a replication slot to use a stats entry it should not have used
when created, triggering an assertion failure when retrieving an
inconsistent entry from the dshash table used by the stats facility.

The issue is that pgstat_drop_replslot() calls pgstat_drop_entry()
without checking the result.  If pgstat_drop_entry() cannot free the
entry related to the object dropped, pgstat_request_entry_refs_gc()
should be called.  AtEOXact_PgStat_DroppedStats() and surrounding
routines dropping stats entries already do that.

This is documented in pgstat_internal.h, but let's add a comment at the
top of pgstat_drop_entry() as that can be easy to miss.

Reported-by: Alexander Lakhin
Author: Floris Van Nee
Analyzed-by: Andres Freund
Discussion: https://postgr.es/m/17947-b9554521ad963c9c@postgresql.org
Backpatch-through: 15
src/backend/utils/activity/pgstat_replslot.c
src/backend/utils/activity/pgstat_shmem.c