@@ -204,6 +204,14 @@ char const* const MtmNodeStatusMnem[] =
204
204
"OutOfService"
205
205
};
206
206
207
+ char const * const MtmTxnStatusMnem [] =
208
+ {
209
+ "InProgress" ,
210
+ "Committed" ,
211
+ "Aborted" ,
212
+ "Unknown"
213
+ };
214
+
207
215
bool MtmDoReplication ;
208
216
char * MtmDatabaseName ;
209
217
char * MtmDatabaseUser ;
@@ -595,17 +603,17 @@ MtmAdjustOldestXid(TransactionId xid)
595
603
if (MtmUseDtm && !MtmVolksWagenMode )
596
604
{
597
605
if (prev != NULL ) {
598
- MTM_LOG2 ("%d: MtmAdjustOldestXid: oldestXid=%d, prev->xid=%d, prev->status=%d , prev->snapshot=%ld, ts->xid=%d, ts->status=%d, ts->snapshot=%ld, oldestSnapshot=%ld" ,
599
- MyProcPid , xid , prev -> xid , prev -> status , prev -> snapshot , (ts ? ts -> xid : 0 ), (ts ? ts -> status : -1 ), (ts ? ts -> snapshot : -1 ), oldestSnapshot );
606
+ MTM_LOG2 ("%d: MtmAdjustOldestXid: oldestXid=%d, prev->xid=%d, prev->status=%s , prev->snapshot=%ld, ts->xid=%d, ts->status=%d, ts->snapshot=%ld, oldestSnapshot=%ld" ,
607
+ MyProcPid , xid , prev -> xid , MtmTxnStatusMnem [ prev -> status ] , prev -> snapshot , (ts ? ts -> xid : 0 ), (ts ? ts -> status : -1 ), (ts ? ts -> snapshot : -1 ), oldestSnapshot );
600
608
Mtm -> transListHead = prev ;
601
609
Mtm -> oldestXid = xid = prev -> xid ;
602
610
} else if (TransactionIdPrecedes (Mtm -> oldestXid , xid )) {
603
611
xid = Mtm -> oldestXid ;
604
612
}
605
613
} else {
606
614
if (prev != NULL ) {
607
- MTM_LOG2 ("%d: MtmAdjustOldestXid: oldestXid=%d, prev->xid=%d, prev->status=%d , prev->snapshot=%ld, ts->xid=%d, ts->status=%d, ts->snapshot=%ld, oldestSnapshot=%ld" ,
608
- MyProcPid , xid , prev -> xid , prev -> status , prev -> snapshot , (ts ? ts -> xid : 0 ), (ts ? ts -> status : -1 ), (ts ? ts -> snapshot : -1 ), oldestSnapshot );
615
+ MTM_LOG2 ("%d: MtmAdjustOldestXid: oldestXid=%d, prev->xid=%d, prev->status=%s , prev->snapshot=%ld, ts->xid=%d, ts->status=%d, ts->snapshot=%ld, oldestSnapshot=%ld" ,
616
+ MyProcPid , xid , prev -> xid , MtmTxnStatusMnem [ prev -> status ] , prev -> snapshot , (ts ? ts -> xid : 0 ), (ts ? ts -> status : -1 ), (ts ? ts -> snapshot : -1 ), oldestSnapshot );
609
617
Mtm -> transListHead = prev ;
610
618
}
611
619
}
@@ -933,7 +941,8 @@ void MtmPrecommitTransaction(char const* gid)
933
941
{
934
942
MtmTransMap * tm = (MtmTransMap * )hash_search (MtmGid2State , gid , HASH_FIND , NULL );
935
943
if (tm == NULL ) {
936
- elog (WARNING , "MtmPrecommitTransaction: transaciton '%s' is not found" , gid );
944
+ MtmUnlock ();
945
+ elog (WARNING , "MtmPrecommitTransaction: transaction '%s' is not found" , gid );
937
946
} else {
938
947
MtmTransState * ts = tm -> state ;
939
948
Assert (ts != NULL );
@@ -942,10 +951,11 @@ void MtmPrecommitTransaction(char const* gid)
942
951
ts -> csn = MtmAssignCSN ();
943
952
MtmAdjustSubtransactions (ts );
944
953
MtmSend2PCMessage (ts , MSG_PRECOMMITTED );
945
- SetPrepareTransactionState (ts -> gid , "precommitted" );
954
+ Assert (replorigin_session_origin != InvalidRepOriginId );
955
+ MtmUnlock ();
956
+ SetPreparedTransactionState (ts -> gid , MULTIMASTER_PRECOMMITTED );
946
957
}
947
958
}
948
- MtmUnlock ();
949
959
}
950
960
951
961
@@ -967,15 +977,18 @@ MtmVotingCompleted(MtmTransState* ts)
967
977
ts -> status = TRANSACTION_STATUS_UNKNOWN ;
968
978
return true;
969
979
} else {
970
- MTM_LOG1 ("Transaction %s is considered as prepared (status=%d participants=%lx disabled=%lx, voted=%lx)" ,
971
- ts -> gid , ts -> status , ts -> participantsMask , Mtm -> disabledNodeMask , ts -> votedMask );
980
+ MTM_LOG1 ("Transaction %s is considered as prepared (status=%s participants=%lx disabled=%lx, voted=%lx)" ,
981
+ ts -> gid , MtmTxnStatusMnem [ ts -> status ] , ts -> participantsMask , Mtm -> disabledNodeMask , ts -> votedMask );
972
982
ts -> isPrepared = true;
973
983
if (ts -> isTwoPhase ) {
974
984
ts -> votingCompleted = true;
975
985
return true;
976
986
} else if (MtmUseDtm ) {
977
987
ts -> votedMask = 0 ;
978
- SetPrepareTransactionState (ts -> gid , MULTIMASTER_PRECOMMITTED );
988
+ Assert (replorigin_session_origin == InvalidRepOriginId );
989
+ MtmUnlock ();
990
+ SetPreparedTransactionState (ts -> gid , MULTIMASTER_PRECOMMITTED );
991
+ MtmLock (LW_EXCLUSIVE );
979
992
//MtmSend2PCMessage(ts, MSG_PRECOMMIT);
980
993
return false;
981
994
} else {
@@ -1023,7 +1036,7 @@ Mtm2PCVoting(MtmCurrentTrans* x, MtmTransState* ts)
1023
1036
if (ts -> isPrepared ) {
1024
1037
/* resend precommit message */
1025
1038
// MtmSend2PCMessage(ts, MSG_PRECOMMIT);
1026
- elog (LOG , "Distributes transaction is not committed in %ld msec" , USEC_TO_MSEC (now - start ));
1039
+ elog (LOG , "Distributed transaction is not committed in %ld msec" , USEC_TO_MSEC (now - start ));
1027
1040
} else {
1028
1041
elog (WARNING , "Commit of distributed transaction is canceled because of %ld msec timeout expiration" , USEC_TO_MSEC (timeout ));
1029
1042
MtmAbortTransaction (ts );
@@ -1047,7 +1060,7 @@ Mtm2PCVoting(MtmCurrentTrans* x, MtmTransState* ts)
1047
1060
}
1048
1061
}
1049
1062
x -> status = ts -> status ;
1050
- MTM_LOG3 ("%d: Result of vote: %d" , MyProcPid , ts -> status );
1063
+ MTM_LOG3 ("%d: Result of vote: %d" , MyProcPid , MtmTxnStatusMnem [ ts -> status ] );
1051
1064
}
1052
1065
1053
1066
static void
@@ -1071,6 +1084,7 @@ MtmPostPrepareTransaction(MtmCurrentTrans* x)
1071
1084
//if (x->gid[0]) MTM_LOG1("Preparing transaction %d (%s) at %ld", x->xid, x->gid, MtmGetCurrentTime());
1072
1085
if (!MtmIsCoordinator (ts ) || Mtm -> status == MTM_RECOVERY ) {
1073
1086
MTM_TXTRACE (x , "recovery?" );
1087
+ MTM_LOG3 ("Preparing transaction %d (%s) at %ld" , x -> xid , x -> gid , MtmGetCurrentTime ());
1074
1088
Assert (x -> gid [0 ]);
1075
1089
ts -> votingCompleted = true;
1076
1090
MTM_TXTRACE (x , "recovery? 1" );
@@ -1130,9 +1144,12 @@ MtmCommitPreparedTransaction(MtmCurrentTrans* x)
1130
1144
ts -> votingCompleted = false;
1131
1145
ts -> votedMask = 0 ;
1132
1146
ts -> procno = MyProc -> pgprocno ;
1133
- MTM_TXTRACE (ts , "Coordinator sends MSG_PRECOMMIT" );
1134
- SetPrepareTransactionState (ts -> gid , MULTIMASTER_PRECOMMITTED );
1147
+ MTM_LOG2 ("Coordinator of transaction %s sends MSG_PRECOMMIT" , ts -> gid );
1148
+ Assert (replorigin_session_origin == InvalidRepOriginId );
1149
+ MtmUnlock ();
1150
+ SetPreparedTransactionState (ts -> gid , MULTIMASTER_PRECOMMITTED );
1135
1151
//MtmSend2PCMessage(ts, MSG_PRECOMMIT);
1152
+ MtmLock (LW_EXCLUSIVE );
1136
1153
1137
1154
Mtm2PCVoting (x , ts );
1138
1155
@@ -1202,17 +1219,14 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
1202
1219
}
1203
1220
if (ts != NULL ) {
1204
1221
if (* ts -> gid )
1205
- MTM_LOG2 ("TRANSLOG: %s transaction gid=%s xid=%d node=%d dxid=%d status %d " ,
1206
- (commit ? "commit" : "rollback" ), ts -> gid , ts -> xid , ts -> gtid .node , ts -> gtid .xid , ts -> status );
1222
+ MTM_LOG2 ("TRANSLOG: %s transaction gid=%s xid=%d node=%d dxid=%d status %s " ,
1223
+ (commit ? "commit" : "rollback" ), ts -> gid , ts -> xid , ts -> gtid .node , ts -> gtid .xid , MtmTxnStatusMnem [ ts -> status ] );
1207
1224
if (commit ) {
1208
1225
if (!(ts -> status == TRANSACTION_STATUS_UNKNOWN
1209
1226
|| (ts -> status == TRANSACTION_STATUS_IN_PROGRESS && Mtm -> status == MTM_RECOVERY )))
1210
- {
1211
- Assert (false);
1227
+ { Assert (false);
1212
1228
elog (ERROR , "Attempt to commit %s transaction %d (%s)" ,
1213
- ts -> status == TRANSACTION_STATUS_ABORTED ? "aborted"
1214
- : ts -> status == TRANSACTION_STATUS_COMMITTED ? "committed" : "not prepared" ,
1215
- ts -> xid , ts -> gid );
1229
+ MtmTxnStatusMnem [ts -> status ], ts -> xid , ts -> gid );
1216
1230
}
1217
1231
if (x -> csn > ts -> csn || Mtm -> status == MTM_RECOVERY ) {
1218
1232
Assert (x -> csn != INVALID_CSN );
@@ -1324,6 +1338,7 @@ void MtmSend2PCMessage(MtmTransState* ts, MtmMessageCode cmd)
1324
1338
}
1325
1339
}
1326
1340
} else if (!BIT_CHECK (Mtm -> disabledNodeMask , ts -> gtid .node - 1 )) {
1341
+ MTM_LOG2 ("Send %s message to node %d xid=%d gid=%s" , MtmMessageKindMnem [cmd ], ts -> gtid .node , ts -> gtid .xid , ts -> gid );
1327
1342
msg .node = ts -> gtid .node ;
1328
1343
msg .dxid = ts -> gtid .xid ;
1329
1344
MtmSendMessage (& msg );
@@ -1522,7 +1537,7 @@ void MtmAbortTransaction(MtmTransState* ts)
1522
1537
if (ts -> status == TRANSACTION_STATUS_COMMITTED ) {
1523
1538
elog (LOG , "Attempt to rollback already committed transaction %d (%s)" , ts -> xid , ts -> gid );
1524
1539
} else {
1525
- MTM_LOG1 ("Rollback active transaction %d:%d (local xid %d) status %d " , ts -> gtid .node , ts -> gtid .xid , ts -> xid , ts -> status );
1540
+ MTM_LOG1 ("Rollback active transaction %d:%d (local xid %d) status %s " , ts -> gtid .node , ts -> gtid .xid , ts -> xid , MtmTxnStatusMnem [ ts -> status ] );
1526
1541
ts -> status = TRANSACTION_STATUS_ABORTED ;
1527
1542
MtmAdjustSubtransactions (ts );
1528
1543
if (ts -> isActive ) {
@@ -1590,8 +1605,8 @@ static void MtmPollStatusOfPreparedTransactions(int disabledNodeId)
1590
1605
MtmBroadcastPollMessage (ts );
1591
1606
}
1592
1607
} else {
1593
- MTM_LOG1 ("Skip transaction %d (%s) with status %d gtid.node=%d gtid.xid=%d votedMask=%lx" ,
1594
- ts -> xid , ts -> gid , ts -> status , ts -> gtid .node , ts -> gtid .xid , ts -> votedMask );
1608
+ MTM_LOG1 ("Skip transaction %d (%s) with status %s gtid.node=%d gtid.xid=%d votedMask=%lx" ,
1609
+ ts -> xid , ts -> gid , MtmTxnStatusMnem [ ts -> status ] , ts -> gtid .node , ts -> gtid .xid , ts -> votedMask );
1595
1610
}
1596
1611
}
1597
1612
}
@@ -1926,8 +1941,8 @@ bool MtmRefreshClusterStatus(bool nowait)
1926
1941
MtmTransState * ts ;
1927
1942
/* Interrupt voting for active transaction and abort them */
1928
1943
for (ts = Mtm -> transListHead ; ts != NULL ; ts = ts -> next ) {
1929
- MTM_LOG3 ("Active transaction gid='%s', coordinator=%d, xid=%d, status=%d , gtid.xid=%d" ,
1930
- ts -> gid , ts -> gtid .node , ts -> xid , ts -> status , ts -> gtid .xid );
1944
+ MTM_LOG3 ("Active transaction gid='%s', coordinator=%d, xid=%d, status=%s , gtid.xid=%d" ,
1945
+ ts -> gid , ts -> gtid .node , ts -> xid , MtmTxnStatusMnen [ ts -> status ] , ts -> gtid .xid );
1931
1946
if (MtmIsCoordinator (ts ) && !ts -> votingCompleted && ts -> status != TRANSACTION_STATUS_ABORTED ) {
1932
1947
MtmAbortTransaction (ts );
1933
1948
MtmWakeUpBackend (ts );
@@ -2898,7 +2913,7 @@ void MtmReleaseRecoverySlot(int nodeId)
2898
2913
void MtmRollbackPreparedTransaction (int nodeId , char const * gid )
2899
2914
{
2900
2915
XidStatus status = MtmExchangeGlobalTransactionStatus (gid , TRANSACTION_STATUS_ABORTED );
2901
- MTM_LOG1 ("Abort prepared transaction %s status %d " , gid , status );
2916
+ MTM_LOG1 ("Abort prepared transaction %s status %s " , gid , MtmTxnStatusMnem [ status ] );
2902
2917
if (status == TRANSACTION_STATUS_UNKNOWN ) {
2903
2918
MTM_LOG2 ("PGLOGICAL_ABORT_PREPARED commit: gid=%s #2" , gid );
2904
2919
MtmResetTransaction ();
@@ -3176,6 +3191,9 @@ MtmReplicationTxnFilterHook(struct PGLogicalTxnFilterArgs* args)
3176
3191
bool res = Mtm -> status != MTM_RECOVERY
3177
3192
&& (args -> origin_id == InvalidRepOriginId
3178
3193
|| MtmIsRecoveredNode (MtmReplicationNodeId ));
3194
+ if (!res ) {
3195
+ MTM_LOG2 ("Filter transaction with origin_id=%d" , args -> origin_id );
3196
+ }
3179
3197
return res ;
3180
3198
}
3181
3199
@@ -3211,7 +3229,7 @@ bool MtmFilterTransaction(char* record, int size)
3211
3229
int replication_node ;
3212
3230
int origin_node ;
3213
3231
char const * gid = "" ;
3214
- char msgtype ;
3232
+ char msgtype PG_USED_FOR_ASSERTS_ONLY ;
3215
3233
bool duplicate = false;
3216
3234
3217
3235
s .data = record ;
0 commit comments