@@ -89,6 +89,7 @@ PG_MODULE_MAGIC;
89
89
PG_FUNCTION_INFO_V1 (mtm_start_replication );
90
90
PG_FUNCTION_INFO_V1 (mtm_stop_replication );
91
91
PG_FUNCTION_INFO_V1 (mtm_drop_node );
92
+ PG_FUNCTION_INFO_V1 (mtm_recover_node );
92
93
PG_FUNCTION_INFO_V1 (mtm_get_snapshot );
93
94
94
95
static Snapshot MtmGetSnapshot (Snapshot snapshot );
@@ -1182,6 +1183,22 @@ MtmSlotMode MtmReceiverSlotMode(int nodeId)
1182
1183
return dtm -> recoverySlot ?SLOT_CREATE_NEW :SLOT_OPEN_ALWAYS ;
1183
1184
}
1184
1185
1186
+ void MtmRecoverNode (int nodeId )
1187
+ {
1188
+ if (nodeId <=0 || nodeId > dtm -> nNodes )
1189
+ {
1190
+ elog (ERROR ,"NodeID %d is out of range [1,%d]" ,nodeId ,dtm -> nNodes );
1191
+ }
1192
+ if (!BIT_CHECK (dtm -> disabledNodeMask ,nodeId - 1 )) {
1193
+ elog (ERROR ,"Node %d was not disabled" ,nodeId );
1194
+ }
1195
+ if (!IsTransactionBlock ())
1196
+ {
1197
+ MtmBroadcastUtilityStmt (psprintf ("select pg_create_logical_replication_slot('" MULTIMASTER_SLOT_PATTERN "', '" MULTIMASTER_NAME "')" ,nodeId ), true);
1198
+ }
1199
+ }
1200
+
1201
+
1185
1202
void MtmDropNode (int nodeId ,bool dropSlot )
1186
1203
{
1187
1204
if (!BIT_CHECK (dtm -> disabledNodeMask ,nodeId - 1 ))
@@ -1227,6 +1244,14 @@ mtm_drop_node(PG_FUNCTION_ARGS)
1227
1244
PG_RETURN_VOID ();
1228
1245
}
1229
1246
1247
+ Datum
1248
+ mtm_recover_node (PG_FUNCTION_ARGS )
1249
+ {
1250
+ int nodeId = PG_GETARG_INT32 (0 );
1251
+ MtmRecoverNode (nodeId );
1252
+ PG_RETURN_VOID ();
1253
+ }
1254
+
1230
1255
Datum
1231
1256
mtm_get_snapshot (PG_FUNCTION_ARGS )
1232
1257
{
@@ -1599,7 +1624,7 @@ MtmSerializeLock(PROCLOCK* proclock, void* arg)
1599
1624
{
1600
1625
if ((proclock -> holdMask & LOCKBIT_ON (lm ))&& (conflictMask & LOCKBIT_ON (lm )))
1601
1626
{
1602
- MTM_TRACE ("%d: %u(%u) waits for %u(%u)\n" ,getpid () ,srcPgXact -> xid ,proc -> pid ,dstPgXact -> xid ,proclock -> tag .myProc -> pid );
1627
+ MTM_TRACE ("%d: %u(%u) waits for %u(%u)\n" ,MyProcPid ,srcPgXact -> xid ,proc -> pid ,dstPgXact -> xid ,proclock -> tag .myProc -> pid );
1603
1628
MtmGetGtid (srcPgXact -> xid ,& gtid );/* transaction holding lock */
1604
1629
ByteBufferAppendInt32 (buf ,gtid .node );
1605
1630
ByteBufferAppendInt32 (buf ,gtid .xid );
@@ -1689,6 +1714,7 @@ void MtmRefreshClusterStatus(bool nowait)
1689
1714
1690
1715
clique = MtmFindMaxClique (matrix ,MtmNodes ,& clique_size );
1691
1716
if (clique_size >=MtmNodes /2 + 1 ) {/* have quorum */
1717
+ elog (WARNING ,"Find clique %lx, disabledNodeMask %lx" ,clique ,dtm -> disabledNodeMask );
1692
1718
MtmLock (LW_EXCLUSIVE );
1693
1719
mask = ~clique & (((nodemask_t )1 <<MtmNodes )- 1 )& ~dtm -> disabledNodeMask ;/* new disabled nodes mask */
1694
1720
for (i = 0 ;mask != 0 ;i ++ ,mask >>=1 ) {