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:28:49 +0000 (14:28 +0200)
commitaf8cd1639ab298ba8fae62cd9583f1c10a5068e1
tree56a8715b6c6fbada2521e6f178cd7d70f14449bc
parentce9a74707d4cf7768cff06298d09c7f7e823341d
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/test/modules/test_misc/meson.build
src/test/modules/test_misc/t/007_catcache_inval.pl [new file with mode: 0644]
src/tools/pgindent/typedefs.list