3333
3434#include "libdtm.h"
3535
36+ #define MIN_DELAY 10000
37+ #define MAX_DELAY 100000
38+
3639void _PG_init (void );
3740void _PG_fini (void );
3841
@@ -121,30 +124,41 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
121124 return snapshot ;
122125}
123126
124- #if 0
125127static bool IsInDtmSnapshot (TransactionId xid )
126128{
127129 return DtmHasSnapshot
128130 && (/*xid > DtmSnapshot.xmax
129131 || */ bsearch (& xid , DtmSnapshot .xip , DtmSnapshot .xcnt , sizeof (TransactionId ), xidComparator ) != NULL );
130132}
131- #endif
132133
133134static bool DtmTransactionIsInProgress (TransactionId xid )
134135{
135- return /*IsInDtmSnapshot(xid) || */ TransactionIdIsRunning (xid );
136+ #if 0
137+ if (IsInDtmSnapshot (xid )) {
138+ unsigned delay = MIN_DELAY ;
139+ XLogRecPtr lsn ;
140+ while (CLOGTransactionIdGetStatus (xid , & lsn ) == TRANSACTION_STATUS_IN_PROGRESS ) {
141+ pg_usleep (delay );
142+ if (delay < MAX_DELAY ) {
143+ delay *= 2 ;
144+ }
145+ }
146+ return false;
147+ }
148+ #endif
149+ return TransactionIdIsRunning (xid ) && !IsInDtmSnapshot (xid );
136150}
137151
138152static XidStatus DtmGetGloabalTransStatus (TransactionId xid )
139153{
140- unsigned delay = 1000 ;
154+ unsigned delay = MIN_DELAY ;
141155 while (true) {
142156 XidStatus status ;
143157 DtmEnsureConnection ();
144158 status = DtmGlobalGetTransStatus (DtmConn , DtmNodeId , xid );
145159 if (status == TRANSACTION_STATUS_IN_PROGRESS ) {
146160 pg_usleep (delay );
147- if (delay < 100000 ) {
161+ if (delay < MAX_DELAY ) {
148162 delay *= 2 ;
149163 }
150164 } else {
@@ -155,16 +169,17 @@ static XidStatus DtmGetGloabalTransStatus(TransactionId xid)
155169
156170static XidStatus DtmGetTransactionStatus (TransactionId xid , XLogRecPtr * lsn )
157171{
158- XidStatus status = CLOGTransactionIdGetStatus (xid , lsn );
159- #if 0
160- if (status == TRANSACTION_STATUS_IN_PROGRESS ) {
161- status = DtmGetGloabalTransStatus (xid );
162- if (status == TRANSACTION_STATUS_UNKNOWN ) {
163- status = TRANSACTION_STATUS_IN_PROGRESS ;
172+ if (IsInDtmSnapshot (xid )) {
173+ unsigned delay = MIN_DELAY ;
174+ XLogRecPtr lsn ;
175+ while (CLOGTransactionIdGetStatus (xid , & lsn ) == TRANSACTION_STATUS_IN_PROGRESS ) {
176+ pg_usleep (delay );
177+ if (delay < MAX_DELAY ) {
178+ delay *= 2 ;
179+ }
164180 }
165181 }
166- #endif
167- return status ;
182+ return CLOGTransactionIdGetStatus (xid , lsn );
168183}
169184
170185
0 commit comments