diff options
author | Noah Misch <noah@leadboat.com> | 2024-11-02 09:04:56 -0700 |
---|---|---|
committer | Noah Misch <noah@leadboat.com> | 2024-11-02 09:04:56 -0700 |
commit | 0bada39c83a150079567a6e97b1a25a198f30ea3 (patch) | |
tree | 291571016e3d1a08249f25a9eefff51a47d89ec8 /src/backend/utils/cache | |
parent | b412f402d1e020c5dac94f3bf4a005db69519b99 (diff) | |
download | postgresql-0bada39c83a150079567a6e97b1a25a198f30ea3.tar.gz postgresql-0bada39c83a150079567a6e97b1a25a198f30ea3.zip |
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
Diffstat (limited to 'src/backend/utils/cache')
-rw-r--r-- | src/backend/utils/cache/inval.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 986850ccda9..fc972ed17d6 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -1202,6 +1202,18 @@ AtInplace_Inval(void) } /* + * ForgetInplace_Inval + * Alternative to PreInplace_Inval()+AtInplace_Inval(): discard queued-up + * invalidations. This lets inplace update enumerate invalidations + * optimistically, before locking the buffer. + */ +void +ForgetInplace_Inval(void) +{ + inplaceInvalInfo = NULL; +} + +/* * AtEOSubXact_Inval * Process queued-up invalidation messages at end of subtransaction. * |