Thread: pgsql: Fix inplace update buffer self-deadlock.
Fix inplace update buffer self-deadlock. A CacheInvalidateHeapTuple* callee might call CatalogCacheInitializeCache(), which needs a relcache entry. Acquiring a valid relcache entry might scan pg_class. Hence, to prevent undetected LWLock self-deadlock, CacheInvalidateHeapTuple* callers must not hold BUFFER_LOCK_EXCLUSIVE on buffers of pg_class. Move the CacheInvalidateHeapTupleInplace() before the BUFFER_LOCK_EXCLUSIVE. No back-patch, since I've reverted commit 243e9b40f1b2dd09d6e5bf91ebf6e822a2cd3704 from non-master branches. Reported by Alexander Lakhin. Reviewed by Alexander Lakhin. Discussion: https://postgr.es/m/10ec0bc3-5933-1189-6bb8-5dec4114558e@gmail.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/0bada39c83a150079567a6e97b1a25a198f30ea3 Modified Files -------------- src/backend/access/heap/heapam.c | 21 +++++++++++++-------- src/backend/utils/cache/inval.c | 12 ++++++++++++ src/include/utils/inval.h | 1 + 3 files changed, 26 insertions(+), 8 deletions(-)