Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 66ee06f

Browse files
knizhnikkelvich
authored andcommitted
Yet another version of MtmAdjustOldestXid
1 parent bf168d6 commit 66ee06f

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

multimaster.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ csn_t MtmTransactionSnapshot(TransactionId xid)
329329

330330
MtmLock(LW_SHARED);
331331
ts = hash_search(MtmXid2State, &xid, HASH_FIND, NULL);
332-
if (ts != NULL) {
332+
if (ts != NULL && !ts->isLocal) {
333333
snapshot = ts->snapshot;
334334
}
335335
MtmUnlock();
@@ -451,8 +451,8 @@ MtmAdjustOldestXid(TransactionId xid)
451451

452452
MtmLock(LW_EXCLUSIVE);
453453
ts = (MtmTransState*)hash_search(MtmXid2State, &xid, HASH_FIND, NULL);
454-
if (ts != NULL && ts->status == TRANSACTION_STATUS_COMMITTED) {
455-
csn_t oldestSnapshot = ts->csn;
454+
if (ts != NULL) {
455+
csn_t oldestSnapshot = ts->snapshot;
456456
Mtm->nodes[MtmNodeId-1].oldestSnapshot = oldestSnapshot;
457457
for (i = 0; i < Mtm->nAllNodes; i++) {
458458
if (!BIT_CHECK(Mtm->disabledNodeMask, i)
@@ -482,8 +482,7 @@ MtmAdjustOldestXid(TransactionId xid)
482482
if (prev != NULL) {
483483
Mtm->transListHead = prev;
484484
Mtm->oldestXid = xid = prev->xid;
485-
} else {
486-
Assert(TransactionIdPrecedesOrEquals(Mtm->oldestXid, xid));
485+
} else if (TransactionIdPrecedes(Mtm->oldestXid, xid)) {
487486
xid = Mtm->oldestXid;
488487
}
489488
} else {
@@ -649,6 +648,7 @@ MtmCreateTransState(MtmCurrentTrans* x)
649648
if (!found) {
650649
ts->status = TRANSACTION_STATUS_IN_PROGRESS;
651650
ts->snapshot = x->snapshot;
651+
ts->isLocal = true;
652652
if (TransactionIdIsValid(x->gtid.xid)) {
653653
Assert(x->gtid.node != MtmNodeId);
654654
ts->gtid = x->gtid;
@@ -703,7 +703,8 @@ MtmPrePrepareTransaction(MtmCurrentTrans* x)
703703
/*
704704
* Invalid CSN prevent replication of transaction by logical replication
705705
*/
706-
ts->snapshot = x->isReplicated || !x->containsDML ? INVALID_CSN : x->snapshot;
706+
ts->isLocal = x->isReplicated || !x->containsDML;
707+
ts->snapshot = x->snapshot;
707708
ts->csn = MtmAssignCSN();
708709
ts->procno = MyProc->pgprocno;
709710
ts->nVotes = 1; /* I am voted myself */
@@ -833,7 +834,8 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
833834
Assert(TransactionIdIsValid(x->xid));
834835
ts = hash_search(MtmXid2State, &x->xid, HASH_ENTER, NULL);
835836
ts->status = TRANSACTION_STATUS_ABORTED;
836-
ts->snapshot = INVALID_CSN;
837+
ts->isLocal = true;
838+
ts->snapshot = x->snapshot;
837839
ts->csn = MtmAssignCSN();
838840
ts->gtid = x->gtid;
839841
ts->nSubxids = 0;

multimaster.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ typedef struct MtmTransState
145145
struct MtmTransState* nextVoting; /* Next element in L1-list of voting transactions. */
146146
struct MtmTransState* next; /* Next element in L1 list of all finished transaction present in xid2state hash */
147147
bool votingCompleted; /* 2PC voting is completed */
148+
bool isLocal; /* Transaction is either replicated, either doesn't contain DML statements, so it shoudl be ignored by pglogical replication */
148149
TransactionId xids[1]; /* [Mtm->nAllNodes]: transaction ID at replicas */
149150
} MtmTransState;
150151

0 commit comments

Comments
 (0)