From: Simon Riggs Date: Mon, 24 Dec 2012 16:43:22 +0000 (+0000) Subject: Keep rd_newRelfilenodeSubid across overflow. X-Git-Tag: REL9_3_BETA1~563 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae9aba69a8608c6e5df01ee4f20c4799f5d2850c;p=postgresql 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 --- 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++;