Skip to content

Commit

Permalink
lazily create hashset for root transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
aykut-bozkurt committed Aug 31, 2023
1 parent 1de6f96 commit 90c6bbb
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 40 deletions.
1 change: 0 additions & 1 deletion src/backend/distributed/shared_library_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,6 @@ _PG_init(void)

/* initialize coordinated transaction management */
InitializeTransactionManagement();
InitTransactionPropagatedObjectsHash();
InitializeBackendManagement();
InitializeConnectionManagement();
InitPlacementConnectionManagement();
Expand Down
78 changes: 40 additions & 38 deletions src/backend/distributed/transaction/transaction_management.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,9 @@ static void EnsurePrepareTransactionIsAllowed(void);
static HTAB * CurrentTransactionPropagatedObjects(bool readonly);
static HTAB * ParentTransactionPropagatedObjects(bool readonly);
static void MovePropagatedObjectsToParentTransaction(void);
static HTAB * CreateSubtransactionPropagatedObjectsHash(void);
static bool DependencyInPropagatedObjectsHash(HTAB *propagatedObjects,
const ObjectAddress *dependency);
static HTAB * CreateTxPropagatedObjectsHash(void);


/*
Expand Down Expand Up @@ -961,6 +963,11 @@ CurrentTransactionPropagatedObjects(bool readonly)
if (activeSubXactContexts == NIL)
{
/* hashset in the root transaction if there is no sub-transaction */
if (PropagatedObjectsInTx == NULL && !readonly)
{
/* lazily create hashset for root transaction, for mutating uses */
PropagatedObjectsInTx = CreateTxPropagatedObjectsHash();
}
return PropagatedObjectsInTx;
}

Expand All @@ -969,7 +976,7 @@ CurrentTransactionPropagatedObjects(bool readonly)
if (state->propagatedObjects == NULL && !readonly)
{
/* lazily create hashset for sub-transaction, for mutating uses */
state->propagatedObjects = CreateSubtransactionPropagatedObjectsHash();
state->propagatedObjects = CreateTxPropagatedObjectsHash();
}
return state->propagatedObjects;
}
Expand All @@ -993,6 +1000,11 @@ ParentTransactionPropagatedObjects(bool readonly)
* The parent is the root transaction, when there is single level sub-transaction
* or no sub-transaction.
*/
if (PropagatedObjectsInTx == NULL && !readonly)
{
/* lazily create hashset for root transaction, for mutating uses */
PropagatedObjectsInTx = CreateTxPropagatedObjectsHash();
}
return PropagatedObjectsInTx;
}

Expand All @@ -1002,7 +1014,7 @@ ParentTransactionPropagatedObjects(bool readonly)
if (state->propagatedObjects == NULL && !readonly)
{
/* lazily create hashset for parent sub-transaction */
state->propagatedObjects = CreateSubtransactionPropagatedObjectsHash();
state->propagatedObjects = CreateTxPropagatedObjectsHash();
}
return state->propagatedObjects;
}
Expand Down Expand Up @@ -1042,42 +1054,40 @@ MovePropagatedObjectsToParentTransaction(void)


/*
* CreateSubtransactionPropagatedObjectsHash creates a hash table used to keep
* track of the objects propagated in the current subtransaction.
* DependencyInPropagatedObjectsHash checks if dependency is in given hashset
* of propagated objects.
*/
static HTAB *
CreateSubtransactionPropagatedObjectsHash(void)
static bool
DependencyInPropagatedObjectsHash(HTAB *propagatedObjects, const
ObjectAddress *dependency)
{
HASHCTL info;
memset(&info, 0, sizeof(info));
info.keysize = sizeof(ObjectAddress);
info.entrysize = sizeof(ObjectAddress);
info.hash = tag_hash;
info.hcxt = CitusXactCallbackContext;
if (propagatedObjects == NULL)
{
return false;
}

int hashFlags = (HASH_ELEM | HASH_CONTEXT | HASH_FUNCTION);
return hash_create("Subtx-%d Propagated Objects", 16,
&info, hashFlags);
bool found = false;
hash_search(propagatedObjects, dependency, HASH_FIND, &found);
return found;
}


/*
* InitTransactionPropagatedObjectsHash initiates a hash table used to keep
* track of the objects propagated in the root transaction.
* CreateTxPropagatedObjectsHash creates a hashset to keep track of the objects
* propagated in the current root transaction or sub-transaction.
*/
void
InitTransactionPropagatedObjectsHash(void)
static HTAB *
CreateTxPropagatedObjectsHash(void)
{
HASHCTL info;
memset(&info, 0, sizeof(info));
info.keysize = sizeof(ObjectAddress);
info.entrysize = sizeof(ObjectAddress);
info.hash = tag_hash;
info.hcxt = TopMemoryContext;
info.hcxt = CitusXactCallbackContext;

int hashFlags = (HASH_ELEM | HASH_CONTEXT | HASH_FUNCTION);
PropagatedObjectsInTx = hash_create("Tx Propagated Objects", 16,
&info, hashFlags);
return hash_create("Tx Propagated Objects", 16, &info, hashFlags);
}


Expand Down Expand Up @@ -1118,13 +1128,13 @@ TrackPropagatedTableAndSequences(Oid relationId)


/*
* ResetPropagatedObjects resets all objects propagated in the current
* transaction from hash.
* ResetPropagatedObjects destroys hashset of propagated objects in the root transaction.
*/
void
ResetPropagatedObjects(void)
{
hash_delete_all(PropagatedObjectsInTx);
hash_destroy(PropagatedObjectsInTx);
PropagatedObjectsInTx = NULL;
}


Expand All @@ -1139,29 +1149,21 @@ HasAnyDependencyInPropagatedObjects(const ObjectAddress *objectAddress)
ObjectAddress *dependency = NULL;
foreach_ptr(dependency, dependencyList)
{
/* first search in top transaction level */
bool found = false;
hash_search(PropagatedObjectsInTx, dependency, HASH_FIND, &found);
if (found)
/* first search in root transaction */
if (DependencyInPropagatedObjectsHash(PropagatedObjectsInTx, dependency))
{
return true;
}

/* then depth search in all nested subtransactions */
/* search in all nested sub-transactions */
if (activeSubXactContexts == NIL)
{
continue;
}
SubXactContext *state = NULL;
foreach_ptr(state, activeSubXactContexts)
{
if (state->propagatedObjects == NULL)
{
continue;
}

hash_search(state->propagatedObjects, dependency, HASH_FIND, &found);
if (found)
if (DependencyInPropagatedObjectsHash(state->propagatedObjects, dependency))
{
return true;
}
Expand Down
1 change: 0 additions & 1 deletion src/include/distributed/transaction_management.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,6 @@ extern void EnsureDistributedTransactionId(void);
extern bool MaybeExecutingUDF(void);

/* functions for tracking the objects propagated in current transaction */
extern void InitTransactionPropagatedObjectsHash(void);
extern void TrackPropagatedObject(const ObjectAddress *objectAddress);
extern void TrackPropagatedTableAndSequences(Oid relationId);
extern void ResetPropagatedObjects(void);
Expand Down

0 comments on commit 90c6bbb

Please sign in to comment.