@@ -329,7 +329,7 @@ csn_t MtmTransactionSnapshot(TransactionId xid)
329329
330330MtmLock (LW_SHARED );
331331ts = hash_search (MtmXid2State ,& xid ,HASH_FIND ,NULL );
332- if (ts != NULL ) {
332+ if (ts != NULL && ! ts -> isLocal ) {
333333snapshot = ts -> snapshot ;
334334}
335335MtmUnlock ();
@@ -451,8 +451,8 @@ MtmAdjustOldestXid(TransactionId xid)
451451
452452MtmLock (LW_EXCLUSIVE );
453453ts = (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 ;
456456Mtm -> nodes [MtmNodeId - 1 ].oldestSnapshot = oldestSnapshot ;
457457for (i = 0 ;i < Mtm -> nAllNodes ;i ++ ) {
458458if (!BIT_CHECK (Mtm -> disabledNodeMask ,i )
@@ -482,8 +482,7 @@ MtmAdjustOldestXid(TransactionId xid)
482482if (prev != NULL ) {
483483Mtm -> transListHead = prev ;
484484Mtm -> oldestXid = xid = prev -> xid ;
485- }else {
486- Assert (TransactionIdPrecedesOrEquals (Mtm -> oldestXid ,xid ));
485+ }else if (TransactionIdPrecedes (Mtm -> oldestXid ,xid )) {
487486xid = Mtm -> oldestXid ;
488487}
489488}else {
@@ -649,6 +648,7 @@ MtmCreateTransState(MtmCurrentTrans* x)
649648if (!found ) {
650649ts -> status = TRANSACTION_STATUS_IN_PROGRESS ;
651650ts -> snapshot = x -> snapshot ;
651+ ts -> isLocal = true;
652652if (TransactionIdIsValid (x -> gtid .xid )) {
653653Assert (x -> gtid .node != MtmNodeId );
654654ts -> 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 ;
707708ts -> csn = MtmAssignCSN ();
708709ts -> procno = MyProc -> pgprocno ;
709710ts -> nVotes = 1 ;/* I am voted myself */
@@ -833,7 +834,8 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
833834Assert (TransactionIdIsValid (x -> xid ));
834835ts = hash_search (MtmXid2State ,& x -> xid ,HASH_ENTER ,NULL );
835836ts -> status = TRANSACTION_STATUS_ABORTED ;
836- ts -> snapshot = INVALID_CSN ;
837+ ts -> isLocal = true;
838+ ts -> snapshot = x -> snapshot ;
837839ts -> csn = MtmAssignCSN ();
838840ts -> gtid = x -> gtid ;
839841ts -> nSubxids = 0 ;