]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Don't destroy SMgrRelations at relcache invalidation
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 11 Mar 2024 07:08:02 +0000 (09:08 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 11 Mar 2024 07:08:02 +0000 (09:08 +0200)
With commit 21d9c3ee4e, SMgrRelations remain valid until end of
transaction (or longer if they're "pinned"). Relcache invalidation can
happen in the middle of a transaction, so we must not destroy them at
relcache invalidation anymore.

This was revealed by failures in the 'constraints' test in buildfarm
animals using -DCLOBBER_CACHE_ALWAYS. That started failing with commit
8af2565248, which was the first commit that started to rely on an
SMgrRelation living until end of transaction.

Diagnosed-by: Tomas Vondra, Thomas Munro
Reviewed-by: Thomas Munro
Discussion: https://www.postgresql.org/message-id/CA%2BhUKGK%2B5DOmLaBp3Z7C4S-Yv6yoROvr1UncjH2S1ZbPT8D%2BZg%40mail.gmail.com

src/backend/storage/smgr/smgr.c
src/backend/utils/cache/relcache.c

index a5b18328b894f30efcf4744f4d627f1f4366886c..62226d5dca71d82989fca7bfd4d14ecbe89535b3 100644 (file)
@@ -348,8 +348,6 @@ smgrdestroyall(void)
 
 /*
  * smgrreleaseall() -- Release resources used by all objects.
- *
- * This is called for PROCSIGNAL_BARRIER_SMGRRELEASE.
  */
 void
 smgrreleaseall(void)
index 7ad6a35a50ee7dcd20f550336dc2e11c228857a7..2cd19d603fba7ce941e41f15d2fe231f62eca879 100644 (file)
@@ -2985,9 +2985,6 @@ RelationCacheInvalidate(bool debug_discard)
        {
                relation = idhentry->reldesc;
 
-               /* Must close all smgr references to avoid leaving dangling ptrs */
-               RelationCloseSmgr(relation);
-
                /*
                 * Ignore new relations; no other backend will manipulate them before
                 * we commit.  Likewise, before replacing a relation's relfilelocator,
@@ -3039,11 +3036,10 @@ RelationCacheInvalidate(bool debug_discard)
        }
 
        /*
-        * Now zap any remaining smgr cache entries.  This must happen before we
-        * start to rebuild entries, since that may involve catalog fetches which
-        * will re-open catalog files.
+        * We cannot destroy the SMgrRelations as there might still be references
+        * to them, but close the underlying file descriptors.
         */
-       smgrdestroyall();
+       smgrreleaseall();
 
        /* Phase 2: rebuild the items found to need rebuild in phase 1 */
        foreach(l, rebuildFirstList)