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:11 +0000 (14:29 +0200)
commitce7c406f0f8d562e856d43a7e1feb82043f772bc
tree6e4e8f05454b534e55fee351f476f8e0abf1d28f
parent9e9f30139eb87e30be64dc34fad6a01e029e8a56
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: http://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