From 9dfe879d2b6940b6072e277b0104e9cbe4af691e Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 14 May 2014 17:12:57 +0200 Subject: [PATCH] Fix cache invalidation hazard in RelationGetIndexAttrBitmap(). When a cache invalidation arrived inside RelationGetIndexAttrBitmap() inbetween the call to RelationGetIndexList() and one of the index_open() calls relation->rd_replidindex would be reset leading to a corrupted INDEX_ATTR_BITMAP_IDENTITY_KEY return value. That in turn could lead to the old REPLICA IDENTITY not being logged if set to DEFAULT or INDEX. --- src/backend/utils/cache/relcache.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 5ff0d9e..4fc18b5 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3976,6 +3976,7 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind) List *indexoidlist; ListCell *l; MemoryContext oldcxt; + Oid relreplindex; /* Quick exit if we already computed the result. */ if (relation->rd_indexattr != NULL) @@ -4005,6 +4006,12 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind) return NULL; /* + * Store after computing the index list above, to be safe against cache + * flushes inside index_open() below. + */ + relreplindex = relation->rd_replidindex; + + /* * For each index, add referenced attributes to indexattrs. * * Note: we consider all indexes returned by RelationGetIndexList, even if @@ -4038,7 +4045,7 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind) indexInfo->ii_Predicate == NIL; /* Is this index the configured (or default) replica identity? */ - isIDKey = indexOid == relation->rd_replidindex; + isIDKey = indexOid == relreplindex; /* Collect simple attribute references */ for (i = 0; i < indexInfo->ii_NumIndexAttrs; i++) -- 2.0.0.rc2.4.g1dc51c6.dirty