From 78716e55466d76cad79a738d0665235634c94608 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 17 Aug 2017 00:39:24 -0700 Subject: [PATCH] Fix possible shard cache incoherency. When a table and it's shards are dropped, and afterwards the same shard identifiers are reused, e.g. due to a DROP & CREATE EXTENSION, the old entry in the shard cache and the required entry in the shard cache might be for different tables. Force invalidation for both old and new table to fix. --- src/backend/distributed/utils/metadata_cache.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/utils/metadata_cache.c b/src/backend/distributed/utils/metadata_cache.c index 31aab8023..c0ef48860 100644 --- a/src/backend/distributed/utils/metadata_cache.c +++ b/src/backend/distributed/utils/metadata_cache.c @@ -642,11 +642,18 @@ LookupShardCacheEntry(int64 shardId) if (!shardEntry->tableEntry->isValid) { + Oid oldRelationId = shardEntry->tableEntry->relationId; + Oid currentRelationId = LookupShardRelation(shardId); + /* - * The cache entry might not be valid right now. Reload cache entry - * and recheck (as the offset might have changed). + * The relation OID to which the shard belongs could have changed, + * most notably when the extension is dropped and a shard ID is + * reused. Reload the cache entries for both old and new relation + * ID and then look up the shard entry again. */ - LookupDistTableCacheEntry(shardEntry->tableEntry->relationId); + LookupDistTableCacheEntry(oldRelationId); + LookupDistTableCacheEntry(currentRelationId); + recheck = true; } }