summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2012-12-24 16:43:22 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2012-12-24 16:43:22 +0000
commitae9aba69a8608c6e5df01ee4f20c4799f5d2850c (patch)
tree6486332e63333b7c23cd0631310ff77ba7eb9f4c
parent42fa810c144cb76c911cc664244bc369911eb840 (diff)
downloadpostgresql-ae9aba69a8608c6e5df01ee4f20c4799f5d2850c.tar.gz
Keep rd_newRelfilenodeSubid across overflow.
Teach RelationCacheInvalidate() to keep rd_newRelfilenodeSubid across rel cache message overflows, so that behaviour is now fully deterministic. Noah Misch
-rw-r--r--src/backend/utils/cache/relcache.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index f2a9c5dffb..6758d59c90 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -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++;