]> granicus.if.org Git - postgresql/commitdiff
Keep rd_newRelfilenodeSubid across overflow.
authorSimon Riggs <simon@2ndQuadrant.com>
Mon, 24 Dec 2012 16:43:22 +0000 (16:43 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Mon, 24 Dec 2012 16:43:22 +0000 (16:43 +0000)
Teach RelationCacheInvalidate() to keep rd_newRelfilenodeSubid across rel cache
message overflows, so that behaviour is now fully deterministic.

Noah Misch

src/backend/utils/cache/relcache.c

index f2a9c5dffb24084001d9cd3d05eca21c638d420e..6758d59c90d3fd3b30682f6f71bae620006bf550 100644 (file)
@@ -2163,8 +2163,14 @@ RelationCacheInvalidate(void)
                /* Must close all smgr references to avoid leaving dangling ptrs */
                RelationCloseSmgr(relation);
 
-               /* Ignore new relations, since they are never cross-backend targets */
-               if (relation->rd_createSubid != InvalidSubTransactionId)
+               /*
+                * Ignore new relations; no other backend will manipulate them before
+                * we commit.  Likewise, before replacing a relation's relfilenode, we
+                * shall have acquired AccessExclusiveLock and drained any applicable
+                * pending invalidations.
+                */
+               if (relation->rd_createSubid != InvalidSubTransactionId ||
+                       relation->rd_newRelfilenodeSubid != InvalidSubTransactionId)
                        continue;
 
                relcacheInvalsReceived++;