diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 82f9a3c..0f057e4 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -115,6 +115,8 @@ TransactionId *ParallelCurrentXids; */ bool MyXactAccessedTempRel = false; +/* Transaction do the write on local node */ +bool XactWriteLocalNode = false; /* * transaction states - transaction state from server perspective @@ -2158,6 +2160,8 @@ CommitTransaction(void) XactTopTransactionId = InvalidTransactionId; nParallelCurrentXids = 0; + UnregisterTransactionLocalNode(); + /* * done with commit processing, set current transaction state back to * default @@ -2429,6 +2433,8 @@ PrepareTransaction(void) XactTopTransactionId = InvalidTransactionId; nParallelCurrentXids = 0; + UnregisterTransactionLocalNode(); + /* * done with 1st phase commit processing, set current transaction state * back to default @@ -2613,6 +2619,8 @@ AbortTransaction(void) pgstat_report_xact_timestamp(0); } + UnregisterTransactionLocalNode(); + /* * State remains TRANS_ABORT until CleanupTransaction(). */ @@ -4296,6 +4304,24 @@ AbortOutOfAnyTransaction(void) } /* + * RegisterTransactionLocalNode --- remember to wrote on local node + */ +void +RegisterTransactionLocalNode(void) +{ + XactWriteLocalNode = true; +} + +/* + * UnregisterTransactionLocalNode --- forget to wrote on local node + */ +void +UnregisterTransactionLocalNode(void) +{ + XactWriteLocalNode = false; +} + +/* * IsTransactionBlock --- are we within a transaction block? */ bool diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 95e1589..0122d63 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -436,6 +436,9 @@ ExecInsert(ModifyTableState *mtstate, if (resultRelationDesc->rd_att->constr || resultRelInfo->ri_PartitionCheck) ExecConstraints(resultRelInfo, slot, oldslot, estate); + /* Remember to wrote on local node for foreign transaction */ + RegisterTransactionLocalNode(); + if (onconflict != ONCONFLICT_NONE && resultRelInfo->ri_NumIndices > 0) { /* Perform a speculative insertion. */ @@ -697,6 +700,9 @@ ExecDelete(ItemPointer tupleid, } else { + /* Remember to wrote on local node for foreign transaction */ + RegisterTransactionLocalNode(); + /* * delete the tuple * @@ -994,6 +1000,9 @@ lreplace:; if (resultRelationDesc->rd_att->constr || resultRelInfo->ri_PartitionCheck) ExecConstraints(resultRelInfo, slot, slot, estate); + /* Remember to wrote on local node for foreign transaction */ + RegisterTransactionLocalNode(); + /* * replace the heap tuple * diff --git a/src/include/access/xact.h b/src/include/access/xact.h index e7d1191..586f340 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -356,6 +356,8 @@ extern void RegisterXactCallback(XactCallback callback, void *arg); extern void UnregisterXactCallback(XactCallback callback, void *arg); extern void RegisterSubXactCallback(SubXactCallback callback, void *arg); extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg); +extern void RegisterTransactionLocalNode(void); +extern void UnregisterTransactionLocalNode(void); extern int xactGetCommittedChildren(TransactionId **ptr);