33
33
34
34
#include "libdtm.h"
35
35
36
+ #define MIN_DELAY 10000
37
+ #define MAX_DELAY 100000
38
+
36
39
void _PG_init (void );
37
40
void _PG_fini (void );
38
41
@@ -121,30 +124,41 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
121
124
return snapshot ;
122
125
}
123
126
124
- #if 0
125
127
static bool IsInDtmSnapshot (TransactionId xid )
126
128
{
127
129
return DtmHasSnapshot
128
130
&& (/*xid > DtmSnapshot.xmax
129
131
|| */ bsearch (& xid , DtmSnapshot .xip , DtmSnapshot .xcnt , sizeof (TransactionId ), xidComparator ) != NULL );
130
132
}
131
- #endif
132
133
133
134
static bool DtmTransactionIsInProgress (TransactionId xid )
134
135
{
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 );
136
150
}
137
151
138
152
static XidStatus DtmGetGloabalTransStatus (TransactionId xid )
139
153
{
140
- unsigned delay = 1000 ;
154
+ unsigned delay = MIN_DELAY ;
141
155
while (true) {
142
156
XidStatus status ;
143
157
DtmEnsureConnection ();
144
158
status = DtmGlobalGetTransStatus (DtmConn , DtmNodeId , xid );
145
159
if (status == TRANSACTION_STATUS_IN_PROGRESS ) {
146
160
pg_usleep (delay );
147
- if (delay < 100000 ) {
161
+ if (delay < MAX_DELAY ) {
148
162
delay *= 2 ;
149
163
}
150
164
} else {
@@ -155,16 +169,17 @@ static XidStatus DtmGetGloabalTransStatus(TransactionId xid)
155
169
156
170
static XidStatus DtmGetTransactionStatus (TransactionId xid , XLogRecPtr * lsn )
157
171
{
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
+ }
164
180
}
165
181
}
166
- #endif
167
- return status ;
182
+ return CLOGTransactionIdGetStatus (xid , lsn );
168
183
}
169
184
170
185
0 commit comments