Fix catcache invalidation of a list entry that's being built
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 14 Jan 2025 12:28:49 +0000 (14:28 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 14 Jan 2025 12:29:13 +0000 (14:29 +0200)
commitfce17c3a53d6ea7b7aa2178328e8f5a438805244
tree57a622882a85c7c6917ff2a29e15baf23c50c113
parente35ff652056998e48c01c9e49c1a1b5ad6808f0a
Fix catcache invalidation of a list entry that's being built

If a new catalog tuple is inserted that belongs to a catcache list
entry, and cache invalidation happens while the list entry is being
built, the list entry might miss the newly inserted tuple.

To fix, change the way we detect concurrent invalidations while a
catcache entry is being built. Keep a stack of entries that are being
built, and apply cache invalidation to those entries in addition to
the real catcache entries. This is similar to the in-progress list in
relcache.c.

Back-patch to all supported versions.

Reviewed-by: Noah Misch
Discussion: https://www.postgresql.org/message-id/2234dc98-06fe-42ed-b5db-ac17384dc880@iki.fi
src/backend/utils/cache/catcache.c
src/backend/utils/cache/inval.c
src/include/utils/catcache.h
src/tools/pgindent/typedefs.list