Detach relation access tracking from connection management

pull/6092/head
Onder Kalaci 2022-07-27 18:03:53 +02:00
parent fdf090758b
commit d67cf907a2
4 changed files with 31 additions and 9 deletions

View File

@ -1089,9 +1089,6 @@ InitPlacementConnectionManagement(void)
ConnectionShardHash = hash_create("citus connection cache (shardid)", ConnectionShardHash = hash_create("citus connection cache (shardid)",
64, &info, hashFlags); 64, &info, hashFlags);
/* (relationId) = [relationAccessMode] hash */
AllocateRelationAccessHash();
} }

View File

@ -390,6 +390,7 @@ _PG_init(void)
InitializeBackendManagement(); InitializeBackendManagement();
InitializeConnectionManagement(); InitializeConnectionManagement();
InitPlacementConnectionManagement(); InitPlacementConnectionManagement();
InitRelationAccessHash();
InitializeCitusQueryStats(); InitializeCitusQueryStats();
InitializeSharedConnectionStats(); InitializeSharedConnectionStats();
InitializeLocallyReservedSharedConnections(); InitializeLocallyReservedSharedConnections();

View File

@ -47,6 +47,8 @@ bool EnforceForeignKeyRestrictions = true;
(1 << (PLACEMENT_ACCESS_DDL + \ (1 << (PLACEMENT_ACCESS_DDL + \
PARALLEL_MODE_FLAG_OFFSET))) PARALLEL_MODE_FLAG_OFFSET)))
MemoryContext RelationAcessContext = NULL;
/* /*
* Hash table mapping relations to the * Hash table mapping relations to the
@ -84,8 +86,8 @@ typedef struct RelationAccessHashEntry
static HTAB *RelationAccessHash; static HTAB *RelationAccessHash;
/* functions related to access recording */ /* functions related to access recording */
static void AllocateRelationAccessHash(void);
static void RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType); static void RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType);
static void RecordPlacementAccessToCache(Oid relationId, static void RecordPlacementAccessToCache(Oid relationId,
ShardPlacementAccessType accessType); ShardPlacementAccessType accessType);
@ -120,6 +122,18 @@ static bool HoldsConflictingLockWithReferencedRelations(Oid relationId,
conflictingAccessMode); conflictingAccessMode);
/*
* InitRelationAccessHash performs initialization of the
* infrastructure in this file at backend start.
*/
void
InitRelationAccessHash(void)
{
/* allocate (relationId) = [relationAccessMode] hash */
AllocateRelationAccessHash();
}
/* /*
* Empty RelationAccessHash, without destroying the hash table itself. * Empty RelationAccessHash, without destroying the hash table itself.
*/ */
@ -133,19 +147,29 @@ ResetRelationAccessHash()
/* /*
* Allocate RelationAccessHash. * Allocate RelationAccessHash.
*/ */
void static void
AllocateRelationAccessHash(void) AllocateRelationAccessHash(void)
{ {
HASHCTL info; /*
* Create a single context for relation access related memory
* management. Doing so, instead of allocating in TopMemoryContext, makes
* it easier to associate used memory.
*/
RelationAcessContext = AllocSetContextCreateExtended(TopMemoryContext,
"Relation Access Context",
ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE,
ALLOCSET_DEFAULT_MAXSIZE);
HASHCTL info;
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
info.keysize = sizeof(RelationAccessHashKey); info.keysize = sizeof(RelationAccessHashKey);
info.entrysize = sizeof(RelationAccessHashEntry); info.entrysize = sizeof(RelationAccessHashEntry);
info.hash = tag_hash; info.hash = tag_hash;
info.hcxt = ConnectionContext; info.hcxt = RelationAcessContext;
uint32 hashFlags = (HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); uint32 hashFlags = (HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
RelationAccessHash = hash_create("citus connection cache (relationid)", RelationAccessHash = hash_create("citus relation access cache (relationid)",
8, &info, hashFlags); 8, &info, hashFlags);
} }

View File

@ -34,7 +34,7 @@ typedef enum RelationAccessMode
RELATION_PARALLEL_ACCESSED RELATION_PARALLEL_ACCESSED
} RelationAccessMode; } RelationAccessMode;
extern void AllocateRelationAccessHash(void); extern void InitRelationAccessHash(void);
extern void ResetRelationAccessHash(void); extern void ResetRelationAccessHash(void);
extern void RecordRelationAccessIfNonDistTable(Oid relationId, extern void RecordRelationAccessIfNonDistTable(Oid relationId,
ShardPlacementAccessType accessType); ShardPlacementAccessType accessType);