@@ -83,8 +83,9 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot);
83
83
static TransactionId DtmGetOldestXmin (Relation rel , bool ignoreVacuum );
84
84
static bool DtmXidInMVCCSnapshot (TransactionId xid , Snapshot snapshot );
85
85
static TransactionId DtmAdjustOldestXid (TransactionId xid );
86
+ static void DtmSetTransactionStatus (TransactionId xid , int nsubxids , TransactionId * subxids , XidStatus status , XLogRecPtr lsn );
86
87
87
- static TransactionManager DtmTM = { PgTransactionIdGetStatus , PgTransactionIdSetTreeStatus , DtmGetSnapshot , PgGetNewTransactionId , DtmGetOldestXmin , PgTransactionIdIsInProgress , PgGetGlobalTransactionId , DtmXidInMVCCSnapshot };
88
+ static TransactionManager DtmTM = { PgTransactionIdGetStatus , DtmSetTransactionStatus , DtmGetSnapshot , PgGetNewTransactionId , DtmGetOldestXmin , PgTransactionIdIsInProgress , PgGetGlobalTransactionId , DtmXidInMVCCSnapshot };
88
89
89
90
void _PG_init (void );
90
91
void _PG_fini (void );
@@ -456,10 +457,11 @@ bool DtmXidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
456
457
#endif
457
458
while (true)
458
459
{
459
- DtmTransStatus * ts ;
460
- TransactionId subxid = xid ;
461
- while ((ts = (DtmTransStatus * )hash_search (xid2status , & subxid , HASH_FIND , NULL )) == NULL
462
- && TransactionIdIsValid (subxid = SubTransGetParent (subxid )));
460
+ DtmTransStatus * ts = (DtmTransStatus * )hash_search (xid2status , & xid , HASH_FIND , NULL );
461
+ if (ts == NULL && TransactionIdFollowsOrEquals (xid , TransactionXmin )) {
462
+ xid = SubTransGetTopmostTransaction (xid );
463
+ ts = (DtmTransStatus * )hash_search (xid2status , & xid , HASH_FIND , NULL );
464
+ }
463
465
if (ts != NULL )
464
466
{
465
467
if (ts -> cid > dtm_tx .snapshot ) {
@@ -679,8 +681,8 @@ void DtmLocalCommit(DtmTransState* x)
679
681
if (x -> is_prepared ) {
680
682
Assert (found );
681
683
Assert (x -> is_global );
682
- } else {
683
- Assert (!found );
684
+ } else if (! found ) {
685
+ // Assert(!found);
684
686
ts -> cid = dtm_get_cid ();
685
687
IncludeInTransactionList (ts );
686
688
}
@@ -718,8 +720,8 @@ void DtmLocalAbort(DtmTransState* x)
718
720
if (x -> is_prepared ) {
719
721
Assert (found );
720
722
Assert (x -> is_global );
721
- } else {
722
- Assert (!found );
723
+ } else if (! found ) {
724
+ // Assert(!found);
723
725
ts -> cid = dtm_get_cid ();
724
726
IncludeInTransactionList (ts );
725
727
}
@@ -738,3 +740,28 @@ void DtmLocalEnd(DtmTransState* x)
738
740
x -> cid = INVALID_CID ;
739
741
}
740
742
743
+ void DtmSetTransactionStatus (TransactionId xid , int nsubxids , TransactionId * subxids , XidStatus status , XLogRecPtr lsn )
744
+ {
745
+ if (nsubxids != 0 ) {
746
+ SpinLockAcquire (& local -> lock );
747
+ {
748
+ int i ;
749
+ bool found ;
750
+ DtmTransStatus * ts = (DtmTransStatus * )hash_search (xid2status , & xid , HASH_ENTER , & found );
751
+ if (!found ) {
752
+ ts -> cid = dtm_get_cid ();
753
+ }
754
+ ts -> status = status ;
755
+ for (i = 0 ; i < nsubxids ; i ++ ) {
756
+ DtmTransStatus * sts = (DtmTransStatus * )hash_search (xid2status , & subxids [i ], HASH_ENTER , & found );
757
+ Assert (!found );
758
+ sts -> status = status ;
759
+ sts -> cid = ts -> cid ;
760
+ sts -> next = ts -> next ;
761
+ ts -> next = sts ;
762
+ }
763
+ }
764
+ SpinLockRelease (& local -> lock );
765
+ }
766
+ PgTransactionIdSetTreeStatus (xid , nsubxids , subxids , status , lsn );
767
+ }
0 commit comments