@@ -404,6 +404,7 @@ bool MtmXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
404404 * We collest oldest CSNs from all nodes and choose minimum from them.
405405 * If no such XID can be located, then return previously observed oldest XID
406406 */
407+ #if 0
407408static TransactionId
408409MtmAdjustOldestXid (TransactionId xid )
409410{
@@ -457,7 +458,53 @@ MtmAdjustOldestXid(TransactionId xid)
457458 }
458459 return xid ;
459460}
461+ #else
462+ static TransactionId
463+ MtmAdjustOldestXid (TransactionId xid )
464+ {
465+ if (TransactionIdIsValid (xid )) {
466+ MtmTransState * ts , * prev = NULL ;
467+ int i ;
460468
469+ MtmLock (LW_EXCLUSIVE );
470+ ts = (MtmTransState * )hash_search (MtmXid2State , & xid , HASH_FIND , NULL );
471+ if (ts != NULL && ts -> status == TRANSACTION_STATUS_COMMITTED ) {
472+ csn_t oldestSnapshot = ts -> csn ;
473+ Mtm -> nodes [MtmNodeId - 1 ].oldestSnapshot = oldestSnapshot ;
474+ for (i = 0 ; i < MtmNodes ; i ++ ) {
475+ if (!BIT_CHECK (Mtm -> disabledNodeMask , i )
476+ && Mtm -> nodes [i ].oldestSnapshot < oldestSnapshot )
477+ {
478+ oldestSnapshot = Mtm -> nodes [i ].oldestSnapshot ;
479+ }
480+ }
481+ oldestSnapshot -= MtmVacuumDelay * USEC ;
482+
483+ for (ts = Mtm -> transListHead ;
484+ ts != NULL
485+ && ts -> csn < oldestSnapshot
486+ && TransactionIdPrecedes (ts -> xid , xid )
487+ && (ts -> status == TRANSACTION_STATUS_COMMITTED ||
488+ ts -> status == TRANSACTION_STATUS_ABORTED );
489+ prev = ts , ts = ts -> next )
490+ {
491+ if (prev != NULL ) {
492+ /* Remove information about too old transactions */
493+ hash_search (MtmXid2State , & prev -> xid , HASH_REMOVE , NULL );
494+ }
495+ }
496+ }
497+ if (prev != NULL ) {
498+ Mtm -> transListHead = prev ;
499+ Mtm -> oldestXid = xid = prev -> xid ;
500+ } else if (TransactionIdPrecedes (Mtm -> oldestXid , xid )) {
501+ xid = Mtm -> oldestXid ;
502+ }
503+ MtmUnlock ();
504+ }
505+ return xid ;
506+ }
507+ #endif
461508/*
462509 * -------------------------------------------
463510 * Transaction list manipulation
0 commit comments