@@ -404,6 +404,7 @@ bool MtmXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
404
404
* We collest oldest CSNs from all nodes and choose minimum from them.
405
405
* If no such XID can be located, then return previously observed oldest XID
406
406
*/
407
+ #if 0
407
408
static TransactionId
408
409
MtmAdjustOldestXid (TransactionId xid )
409
410
{
@@ -457,7 +458,53 @@ MtmAdjustOldestXid(TransactionId xid)
457
458
}
458
459
return xid ;
459
460
}
461
+ #else
462
+ static TransactionId
463
+ MtmAdjustOldestXid (TransactionId xid )
464
+ {
465
+ if (TransactionIdIsValid (xid )) {
466
+ MtmTransState * ts , * prev = NULL ;
467
+ int i ;
460
468
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
461
508
/*
462
509
* -------------------------------------------
463
510
* Transaction list manipulation
0 commit comments