From 7523753a73cc785d382ae39db1112ccebf7dc86c Mon Sep 17 00:00:00 2001 From: Marco Slot Date: Thu, 17 Aug 2017 15:56:04 +0200 Subject: [PATCH] Clear metadata OID cache prior to deadlock detection --- src/backend/distributed/utils/maintenanced.c | 9 +++++++++ src/backend/distributed/utils/metadata_cache.c | 12 +++++++++++- src/include/distributed/metadata_cache.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/utils/maintenanced.c b/src/backend/distributed/utils/maintenanced.c index e190982be..e2393effc 100644 --- a/src/backend/distributed/utils/maintenanced.c +++ b/src/backend/distributed/utils/maintenanced.c @@ -266,6 +266,15 @@ CitusMaintenanceDaemonMain(Datum main_arg) CHECK_FOR_INTERRUPTS(); + /* + * XXX: We clear the metadata cache before every iteration because otherwise + * it might contain stale OIDs. It appears that in some cases invalidation + * messages for a DROP EXTENSION may arrive during deadlock detection and + * this causes us to cache a stale pg_dist_node OID. We'd actually expect + * all invalidations to arrive after obtaining a lock in LockCitusExtension. + */ + ClearMetadataOIDCache(); + /* * Perform Work. If a specific task needs to be called sooner than * timeout indicates, it's ok to lower it to that value. Expensive diff --git a/src/backend/distributed/utils/metadata_cache.c b/src/backend/distributed/utils/metadata_cache.c index f02e4e4c8..31aab8023 100644 --- a/src/backend/distributed/utils/metadata_cache.c +++ b/src/backend/distributed/utils/metadata_cache.c @@ -2694,11 +2694,21 @@ InvalidateDistRelationCacheCallback(Datum argument, Oid relationId) */ if (relationId != InvalidOid && relationId == MetadataCache.distPartitionRelationId) { - memset(&MetadataCache, 0, sizeof(MetadataCache)); + ClearMetadataOIDCache(); } } +/* + * ClearMetadataOIDCache resets all the cached OIDs and the extensionLoaded flag. + */ +void +ClearMetadataOIDCache(void) +{ + memset(&MetadataCache, 0, sizeof(MetadataCache)); +} + + /* * DistTableOidList iterates over the pg_dist_partition table and returns * a list that consists of the logicalrelids. diff --git a/src/include/distributed/metadata_cache.h b/src/include/distributed/metadata_cache.h index 95f1d4fd7..464214a56 100644 --- a/src/include/distributed/metadata_cache.h +++ b/src/include/distributed/metadata_cache.h @@ -86,6 +86,7 @@ extern List * DistTableOidList(void); extern List * ShardPlacementList(uint64 shardId); extern void CitusInvalidateRelcacheByRelid(Oid relationId); extern void CitusInvalidateRelcacheByShardId(int64 shardId); +extern void ClearMetadataOIDCache(void); extern bool CitusHasBeenLoaded(void); extern bool CheckCitusVersion(int elevel);