@@ -78,22 +78,28 @@ static void
7878MtmCheckState (void )
7979{
8080 // int nVotingNodes = MtmGetNumberOfVotingNodes();
81+ bool isEnabledState ;
8182 int nEnabled = countZeroBits (Mtm -> disabledNodeMask , Mtm -> nAllNodes );
8283 int nConnected = countZeroBits (SELF_CONNECTIVITY_MASK , Mtm -> nAllNodes );
8384 int nReceivers = Mtm -> nAllNodes - countZeroBits (Mtm -> pglogicalReceiverMask , Mtm -> nAllNodes );
8485 int nSenders = Mtm -> nAllNodes - countZeroBits (Mtm -> pglogicalSenderMask , Mtm -> nAllNodes );
8586
86- MTM_LOG1 ("[STATE] Status = (disabled=%s, unaccessible=%s, clique=%s, receivers=%s, senders=%s, total=%i)" ,
87+ MTM_LOG1 ("[STATE] Status = (disabled=%s, unaccessible=%s, clique=%s, receivers=%s, senders=%s, total=%i, major=%d )" ,
8788 maskToString (Mtm -> disabledNodeMask , Mtm -> nAllNodes ),
8889 maskToString (SELF_CONNECTIVITY_MASK , Mtm -> nAllNodes ),
8990 maskToString (Mtm -> clique , Mtm -> nAllNodes ),
9091 maskToString (Mtm -> pglogicalReceiverMask , Mtm -> nAllNodes ),
9192 maskToString (Mtm -> pglogicalSenderMask , Mtm -> nAllNodes ),
92- Mtm -> nAllNodes );
93+ Mtm -> nAllNodes ,
94+ MtmMajorNode );
95+
96+ isEnabledState =
97+ ( (nConnected >= Mtm -> nAllNodes /2 + 1 ) /* majority */
98+ || (nConnected == Mtm -> nAllNodes /2 && MtmMajorNode ) ) /* or half + major node */
99+ && BIT_CHECK (Mtm -> clique , MtmNodeId - 1 ); /* in clique */
93100
94101 /* ANY -> MTM_DISABLED */
95- if ( nConnected < Mtm -> nAllNodes /2 + 1 ||
96- !BIT_CHECK (Mtm -> clique , MtmNodeId - 1 ) )
102+ if (!isEnabledState )
97103 {
98104 BIT_SET (Mtm -> disabledNodeMask , MtmNodeId - 1 );
99105 MtmSetClusterStatus (MTM_DISABLED );
@@ -103,8 +109,7 @@ MtmCheckState(void)
103109 switch (Mtm -> status )
104110 {
105111 case MTM_DISABLED :
106- if ( (nConnected >= Mtm -> nAllNodes /2 + 1 ) && /* majority */
107- BIT_CHECK (Mtm -> clique , MtmNodeId - 1 ) ) /* in clique */
112+ if (isEnabledState )
108113 {
109114 MtmSetClusterStatus (MTM_RECOVERY );
110115 return ;
@@ -298,6 +303,7 @@ void MtmOnNodeDisconnect(int nodeId)
298303 MtmLock (LW_EXCLUSIVE );
299304 BIT_SET (SELF_CONNECTIVITY_MASK , nodeId - 1 );
300305 BIT_SET (Mtm -> reconnectMask , nodeId - 1 );
306+ Mtm -> nConfigChanges += 1 ;
301307 MtmCheckState ();
302308 MtmUnlock ();
303309
0 commit comments