@@ -464,13 +464,15 @@ static void MtmInitialize()
464464dtm -> transListTail = & dtm -> transListHead ;
465465dtm -> nReceivers = 0 ;
466466dtm -> timeShift = 0 ;
467+ dtm -> transCount = 0 ;
468+ memset (dtm -> nodeTransDelay ,0 ,sizeof (dtm -> nodeTransDelay ));
467469PGSemaphoreCreate (& dtm -> votingSemaphore );
468470PGSemaphoreReset (& dtm -> votingSemaphore );
469471SpinLockInit (& dtm -> spinlock );
470472BgwPoolInit (& dtm -> pool ,MtmExecutor ,MtmDatabaseName ,MtmQueueSize );
471473RegisterXactCallback (MtmXactCallback ,NULL );
472474dtmTx .snapshot = INVALID_CSN ;
473- dtmTx .xid = InvalidTransactionId ;
475+ dtmTx .xid = InvalidTransactionId ;
474476}
475477xid2state = MtmCreateHash ();
476478MtmDoReplication = true;
@@ -628,7 +630,8 @@ static void MtmPrecommitTransaction(MtmCurrentTrans* x)
628630ts -> procno = MyProc -> pgprocno ;
629631ts -> nVotes = 0 ;
630632ts -> done = false;
631-
633+ dtm -> transCount += 1 ;
634+
632635if (TransactionIdIsValid (x -> gtid .xid )) {
633636ts -> gtid = x -> gtid ;
634637}else {
@@ -1282,8 +1285,8 @@ typedef struct
12821285int nodeId ;
12831286char * connStrPtr ;
12841287TupleDesc desc ;
1285- Datum values [6 ];
1286- bool nulls [6 ];
1288+ Datum values [7 ];
1289+ bool nulls [7 ];
12871290}MtmGetNodeStateCtx ;
12881291
12891292Datum
@@ -1319,11 +1322,12 @@ mtm_get_nodes_state(PG_FUNCTION_ARGS)
13191322lag = MtmGetSlotLag (usrfctx -> nodeId );
13201323usrfctx -> values [4 ]= Int64GetDatum (lag );
13211324usrfctx -> nulls [4 ]= lag < 0 ;
1325+ usrfctx -> values [5 ]= Int64GetDatum (dtm -> transCount ?dtm -> nodeTransDelay [usrfctx -> nodeId - 1 ]/dtm -> transCount :0 );
13221326p = strchr (usrfctx -> connStrPtr ,',' );
13231327if (p != NULL ) {
13241328* p ++ = '\0' ;
13251329}
1326- usrfctx -> values [5 ]= CStringGetTextDatum (usrfctx -> connStrPtr );
1330+ usrfctx -> values [6 ]= CStringGetTextDatum (usrfctx -> connStrPtr );
13271331usrfctx -> connStrPtr = p ;
13281332usrfctx -> nodeId += 1 ;
13291333
@@ -1334,8 +1338,8 @@ Datum
13341338mtm_get_cluster_state (PG_FUNCTION_ARGS )
13351339{
13361340TupleDesc desc ;
1337- Datum values [7 ];
1338- bool nulls [7 ]= {false};
1341+ Datum values [10 ];
1342+ bool nulls [10 ]= {false};
13391343get_call_result_type (fcinfo ,NULL ,& desc );
13401344
13411345values [0 ]= CStringGetTextDatum (MtmNodeStatusMnem [dtm -> status ]);
@@ -1345,6 +1349,10 @@ mtm_get_cluster_state(PG_FUNCTION_ARGS)
13451349values [4 ]= Int32GetDatum (dtm -> nNodes );
13461350values [5 ]= Int32GetDatum ((int )dtm -> pool .active );
13471351values [6 ]= Int64GetDatum (BgwPoolGetQueueSize (& dtm -> pool ));
1352+ values [7 ]= Int64GetDatum (dtm -> transCount );
1353+ values [8 ]= Int64GetDatum (dtm -> timeShift );
1354+ values [9 ]= Int32GetDatum (dtm -> recoverySlot );
1355+ nulls [9 ]= dtm -> recoverySlot == 0 ;
13481356
13491357PG_RETURN_DATUM (HeapTupleGetDatum (heap_form_tuple (desc ,values ,nulls )));
13501358}