Centralized metadata_cache cache variables into one struct, to avoid missing resets.

E.g. extensionOwner was already missed.
pull/1461/head
Andres Freund 2017-06-20 16:48:46 -07:00
parent 04e4b7d82a
commit f645dca593
1 changed files with 98 additions and 93 deletions

View File

@ -81,27 +81,39 @@ typedef struct ShardCacheEntry
} ShardCacheEntry; } ShardCacheEntry;
/* state which should be cleared upon DROP EXTENSION */ /*
static bool extensionLoaded = false; * State which should be cleared upon DROP EXTENSION. When the configuration
static Oid distShardRelationId = InvalidOid; * changes, e.g. because the extension is dropped, these summarily get set to
static Oid distShardPlacementRelationId = InvalidOid; * 0.
static Oid distNodeRelationId = InvalidOid; */
static Oid distLocalGroupRelationId = InvalidOid; typedef struct MetadataCacheData
static Oid distColocationRelationId = InvalidOid; {
static Oid distColocationConfigurationIndexId = InvalidOid; bool extensionLoaded;
static Oid distColocationColocationidIndexId = InvalidOid; Oid distShardRelationId;
static Oid distPartitionRelationId = InvalidOid; Oid distShardPlacementRelationId;
static Oid distPartitionLogicalRelidIndexId = InvalidOid; Oid distNodeRelationId;
static Oid distPartitionColocationidIndexId = InvalidOid; Oid distLocalGroupRelationId;
static Oid distShardLogicalRelidIndexId = InvalidOid; Oid distColocationRelationId;
static Oid distShardShardidIndexId = InvalidOid; Oid distColocationConfigurationIndexId;
static Oid distShardPlacementShardidIndexId = InvalidOid; Oid distColocationColocationidIndexId;
static Oid distShardPlacementPlacementidIndexId = InvalidOid; Oid distPartitionRelationId;
static Oid distShardPlacementNodeidIndexId = InvalidOid; Oid distPartitionLogicalRelidIndexId;
static Oid distTransactionRelationId = InvalidOid; Oid distPartitionColocationidIndexId;
static Oid distTransactionGroupIndexId = InvalidOid; Oid distShardLogicalRelidIndexId;
static Oid extraDataContainerFuncId = InvalidOid; Oid distShardShardidIndexId;
static Oid workerHashFunctionId = InvalidOid; Oid distShardPlacementShardidIndexId;
Oid distShardPlacementPlacementidIndexId;
Oid distShardPlacementNodeidIndexId;
Oid distTransactionRelationId;
Oid distTransactionGroupIndexId;
Oid extraDataContainerFuncId;
Oid workerHashFunctionId;
Oid extensionOwner;
} MetadataCacheData;
static MetadataCacheData MetadataCache;
/* Citus extension version variables */ /* Citus extension version variables */
bool EnableVersionChecks = true; /* version checks are enabled */ bool EnableVersionChecks = true; /* version checks are enabled */
@ -1094,7 +1106,7 @@ bool
CitusHasBeenLoaded(void) CitusHasBeenLoaded(void)
{ {
/* recheck presence until citus has been loaded */ /* recheck presence until citus has been loaded */
if (!extensionLoaded || creating_extension) if (!MetadataCache.extensionLoaded || creating_extension)
{ {
bool extensionPresent = false; bool extensionPresent = false;
bool extensionScriptExecuted = true; bool extensionScriptExecuted = true;
@ -1115,9 +1127,11 @@ CitusHasBeenLoaded(void)
} }
/* we disable extension features during pg_upgrade */ /* we disable extension features during pg_upgrade */
extensionLoaded = extensionPresent && extensionScriptExecuted && !IsBinaryUpgrade; MetadataCache.extensionLoaded = extensionPresent &&
extensionScriptExecuted &&
!IsBinaryUpgrade;
if (extensionLoaded) if (MetadataCache.extensionLoaded)
{ {
/* /*
* InvalidateDistRelationCacheCallback resets state such as extensionLoaded * InvalidateDistRelationCacheCallback resets state such as extensionLoaded
@ -1140,7 +1154,7 @@ CitusHasBeenLoaded(void)
} }
} }
return extensionLoaded; return MetadataCache.extensionLoaded;
} }
@ -1433,9 +1447,10 @@ InstalledExtensionVersion(void)
Oid Oid
DistShardRelationId(void) DistShardRelationId(void)
{ {
CachedRelationLookup("pg_dist_shard", &distShardRelationId); CachedRelationLookup("pg_dist_shard",
&MetadataCache.distShardRelationId);
return distShardRelationId; return MetadataCache.distShardRelationId;
} }
@ -1443,9 +1458,10 @@ DistShardRelationId(void)
Oid Oid
DistShardPlacementRelationId(void) DistShardPlacementRelationId(void)
{ {
CachedRelationLookup("pg_dist_shard_placement", &distShardPlacementRelationId); CachedRelationLookup("pg_dist_shard_placement",
&MetadataCache.distShardPlacementRelationId);
return distShardPlacementRelationId; return MetadataCache.distShardPlacementRelationId;
} }
@ -1453,9 +1469,10 @@ DistShardPlacementRelationId(void)
Oid Oid
DistNodeRelationId(void) DistNodeRelationId(void)
{ {
CachedRelationLookup("pg_dist_node", &distNodeRelationId); CachedRelationLookup("pg_dist_node",
&MetadataCache.distNodeRelationId);
return distNodeRelationId; return MetadataCache.distNodeRelationId;
} }
@ -1463,9 +1480,10 @@ DistNodeRelationId(void)
Oid Oid
DistLocalGroupIdRelationId(void) DistLocalGroupIdRelationId(void)
{ {
CachedRelationLookup("pg_dist_local_group", &distLocalGroupRelationId); CachedRelationLookup("pg_dist_local_group",
&MetadataCache.distLocalGroupRelationId);
return distLocalGroupRelationId; return MetadataCache.distLocalGroupRelationId;
} }
@ -1473,9 +1491,10 @@ DistLocalGroupIdRelationId(void)
Oid Oid
DistColocationRelationId(void) DistColocationRelationId(void)
{ {
CachedRelationLookup("pg_dist_colocation", &distColocationRelationId); CachedRelationLookup("pg_dist_colocation",
&MetadataCache.distColocationRelationId);
return distColocationRelationId; return MetadataCache.distColocationRelationId;
} }
@ -1484,9 +1503,9 @@ Oid
DistColocationConfigurationIndexId(void) DistColocationConfigurationIndexId(void)
{ {
CachedRelationLookup("pg_dist_colocation_configuration_index", CachedRelationLookup("pg_dist_colocation_configuration_index",
&distColocationConfigurationIndexId); &MetadataCache.distColocationConfigurationIndexId);
return distColocationConfigurationIndexId; return MetadataCache.distColocationConfigurationIndexId;
} }
@ -1495,9 +1514,9 @@ Oid
DistColocationColocationidIndexId(void) DistColocationColocationidIndexId(void)
{ {
CachedRelationLookup("pg_dist_colocation_pkey", CachedRelationLookup("pg_dist_colocation_pkey",
&distColocationColocationidIndexId); &MetadataCache.distColocationColocationidIndexId);
return distColocationColocationidIndexId; return MetadataCache.distColocationColocationidIndexId;
} }
@ -1505,9 +1524,10 @@ DistColocationColocationidIndexId(void)
Oid Oid
DistPartitionRelationId(void) DistPartitionRelationId(void)
{ {
CachedRelationLookup("pg_dist_partition", &distPartitionRelationId); CachedRelationLookup("pg_dist_partition",
&MetadataCache.distPartitionRelationId);
return distPartitionRelationId; return MetadataCache.distPartitionRelationId;
} }
@ -1516,9 +1536,9 @@ Oid
DistPartitionLogicalRelidIndexId(void) DistPartitionLogicalRelidIndexId(void)
{ {
CachedRelationLookup("pg_dist_partition_logical_relid_index", CachedRelationLookup("pg_dist_partition_logical_relid_index",
&distPartitionLogicalRelidIndexId); &MetadataCache.distPartitionLogicalRelidIndexId);
return distPartitionLogicalRelidIndexId; return MetadataCache.distPartitionLogicalRelidIndexId;
} }
@ -1527,9 +1547,9 @@ Oid
DistPartitionColocationidIndexId(void) DistPartitionColocationidIndexId(void)
{ {
CachedRelationLookup("pg_dist_partition_colocationid_index", CachedRelationLookup("pg_dist_partition_colocationid_index",
&distPartitionColocationidIndexId); &MetadataCache.distPartitionColocationidIndexId);
return distPartitionColocationidIndexId; return MetadataCache.distPartitionColocationidIndexId;
} }
@ -1538,9 +1558,9 @@ Oid
DistShardLogicalRelidIndexId(void) DistShardLogicalRelidIndexId(void)
{ {
CachedRelationLookup("pg_dist_shard_logical_relid_index", CachedRelationLookup("pg_dist_shard_logical_relid_index",
&distShardLogicalRelidIndexId); &MetadataCache.distShardLogicalRelidIndexId);
return distShardLogicalRelidIndexId; return MetadataCache.distShardLogicalRelidIndexId;
} }
@ -1548,9 +1568,10 @@ DistShardLogicalRelidIndexId(void)
Oid Oid
DistShardShardidIndexId(void) DistShardShardidIndexId(void)
{ {
CachedRelationLookup("pg_dist_shard_shardid_index", &distShardShardidIndexId); CachedRelationLookup("pg_dist_shard_shardid_index",
&MetadataCache.distShardShardidIndexId);
return distShardShardidIndexId; return MetadataCache.distShardShardidIndexId;
} }
@ -1559,9 +1580,9 @@ Oid
DistShardPlacementShardidIndexId(void) DistShardPlacementShardidIndexId(void)
{ {
CachedRelationLookup("pg_dist_shard_placement_shardid_index", CachedRelationLookup("pg_dist_shard_placement_shardid_index",
&distShardPlacementShardidIndexId); &MetadataCache.distShardPlacementShardidIndexId);
return distShardPlacementShardidIndexId; return MetadataCache.distShardPlacementShardidIndexId;
} }
@ -1570,9 +1591,9 @@ Oid
DistShardPlacementPlacementidIndexId(void) DistShardPlacementPlacementidIndexId(void)
{ {
CachedRelationLookup("pg_dist_shard_placement_placementid_index", CachedRelationLookup("pg_dist_shard_placement_placementid_index",
&distShardPlacementPlacementidIndexId); &MetadataCache.distShardPlacementPlacementidIndexId);
return distShardPlacementPlacementidIndexId; return MetadataCache.distShardPlacementPlacementidIndexId;
} }
@ -1580,9 +1601,10 @@ DistShardPlacementPlacementidIndexId(void)
Oid Oid
DistTransactionRelationId(void) DistTransactionRelationId(void)
{ {
CachedRelationLookup("pg_dist_transaction", &distTransactionRelationId); CachedRelationLookup("pg_dist_transaction",
&MetadataCache.distTransactionRelationId);
return distTransactionRelationId; return MetadataCache.distTransactionRelationId;
} }
@ -1591,9 +1613,9 @@ Oid
DistTransactionGroupIndexId(void) DistTransactionGroupIndexId(void)
{ {
CachedRelationLookup("pg_dist_transaction_group_index", CachedRelationLookup("pg_dist_transaction_group_index",
&distTransactionGroupIndexId); &MetadataCache.distTransactionGroupIndexId);
return distTransactionGroupIndexId; return MetadataCache.distTransactionGroupIndexId;
} }
@ -1602,9 +1624,9 @@ Oid
DistShardPlacementNodeidIndexId(void) DistShardPlacementNodeidIndexId(void)
{ {
CachedRelationLookup("pg_dist_shard_placement_nodeid_index", CachedRelationLookup("pg_dist_shard_placement_nodeid_index",
&distShardPlacementNodeidIndexId); &MetadataCache.distShardPlacementNodeidIndexId);
return distShardPlacementNodeidIndexId; return MetadataCache.distShardPlacementNodeidIndexId;
} }
@ -1615,14 +1637,15 @@ CitusExtraDataContainerFuncId(void)
List *nameList = NIL; List *nameList = NIL;
Oid paramOids[1] = { INTERNALOID }; Oid paramOids[1] = { INTERNALOID };
if (extraDataContainerFuncId == InvalidOid) if (MetadataCache.extraDataContainerFuncId == InvalidOid)
{ {
nameList = list_make2(makeString("pg_catalog"), nameList = list_make2(makeString("pg_catalog"),
makeString("citus_extradata_container")); makeString("citus_extradata_container"));
extraDataContainerFuncId = LookupFuncName(nameList, 1, paramOids, false); MetadataCache.extraDataContainerFuncId =
LookupFuncName(nameList, 1, paramOids, false);
} }
return extraDataContainerFuncId; return MetadataCache.extraDataContainerFuncId;
} }
@ -1630,17 +1653,18 @@ CitusExtraDataContainerFuncId(void)
Oid Oid
CitusWorkerHashFunctionId(void) CitusWorkerHashFunctionId(void)
{ {
if (workerHashFunctionId == InvalidOid) if (MetadataCache.workerHashFunctionId == InvalidOid)
{ {
Oid citusExtensionOid = get_extension_oid("citus", false); Oid citusExtensionOid = get_extension_oid("citus", false);
Oid citusSchemaOid = get_extension_schema(citusExtensionOid); Oid citusSchemaOid = get_extension_schema(citusExtensionOid);
char *citusSchemaName = get_namespace_name(citusSchemaOid); char *citusSchemaName = get_namespace_name(citusSchemaOid);
const int argCount = 1; const int argCount = 1;
workerHashFunctionId = FunctionOid(citusSchemaName, "worker_hash", argCount); MetadataCache.workerHashFunctionId =
FunctionOid(citusSchemaName, "worker_hash", argCount);
} }
return workerHashFunctionId; return MetadataCache.workerHashFunctionId;
} }
@ -1657,11 +1681,10 @@ CitusExtensionOwner(void)
ScanKeyData entry[1]; ScanKeyData entry[1];
HeapTuple extensionTuple = NULL; HeapTuple extensionTuple = NULL;
Form_pg_extension extensionForm = NULL; Form_pg_extension extensionForm = NULL;
static Oid extensionOwner = InvalidOid;
if (extensionOwner != InvalidOid) if (MetadataCache.extensionOwner != InvalidOid)
{ {
return extensionOwner; return MetadataCache.extensionOwner;
} }
relation = heap_open(ExtensionRelationId, AccessShareLock); relation = heap_open(ExtensionRelationId, AccessShareLock);
@ -1693,8 +1716,8 @@ CitusExtensionOwner(void)
ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("citus extension needs to be owned by superuser"))); errmsg("citus extension needs to be owned by superuser")));
} }
extensionOwner = extensionForm->extowner; MetadataCache.extensionOwner = extensionForm->extowner;
Assert(OidIsValid(extensionOwner)); Assert(OidIsValid(MetadataCache.extensionOwner));
} }
else else
{ {
@ -1706,7 +1729,7 @@ CitusExtensionOwner(void)
heap_close(relation, AccessShareLock); heap_close(relation, AccessShareLock);
return extensionOwner; return MetadataCache.extensionOwner;
} }
@ -2382,27 +2405,9 @@ InvalidateDistRelationCacheCallback(Datum argument, Oid relationId)
* This happens pretty rarely, but most importantly happens during * This happens pretty rarely, but most importantly happens during
* DROP EXTENSION citus; * DROP EXTENSION citus;
*/ */
if (relationId != InvalidOid && relationId == distPartitionRelationId) if (relationId != InvalidOid && relationId == MetadataCache.distPartitionRelationId)
{ {
extensionLoaded = false; memset(&MetadataCache, 0, sizeof(MetadataCache));
distShardRelationId = InvalidOid;
distShardPlacementRelationId = InvalidOid;
distLocalGroupRelationId = InvalidOid;
distNodeRelationId = InvalidOid;
distColocationRelationId = InvalidOid;
distColocationConfigurationIndexId = InvalidOid;
distColocationColocationidIndexId = InvalidOid;
distPartitionRelationId = InvalidOid;
distPartitionLogicalRelidIndexId = InvalidOid;
distPartitionColocationidIndexId = InvalidOid;
distShardLogicalRelidIndexId = InvalidOid;
distShardShardidIndexId = InvalidOid;
distShardPlacementShardidIndexId = InvalidOid;
distShardPlacementPlacementidIndexId = InvalidOid;
distTransactionRelationId = InvalidOid;
distTransactionGroupIndexId = InvalidOid;
extraDataContainerFuncId = InvalidOid;
workerHashFunctionId = InvalidOid;
} }
} }
@ -2461,7 +2466,7 @@ DistTableOidList(void)
static void static void
InvalidateNodeRelationCacheCallback(Datum argument, Oid relationId) InvalidateNodeRelationCacheCallback(Datum argument, Oid relationId)
{ {
if (relationId == InvalidOid || relationId == distNodeRelationId) if (relationId == InvalidOid || relationId == MetadataCache.distNodeRelationId)
{ {
workerNodeHashValid = false; workerNodeHashValid = false;
} }
@ -2476,7 +2481,7 @@ static void
InvalidateLocalGroupIdRelationCacheCallback(Datum argument, Oid relationId) InvalidateLocalGroupIdRelationCacheCallback(Datum argument, Oid relationId)
{ {
/* when invalidation happens simply set the LocalGroupId to the default value */ /* when invalidation happens simply set the LocalGroupId to the default value */
if (relationId == InvalidOid || relationId == distLocalGroupRelationId) if (relationId == InvalidOid || relationId == MetadataCache.distLocalGroupRelationId)
{ {
LocalGroupId = -1; LocalGroupId = -1;
} }