Andrew January created ZOOKEEPER-3149:
-----------------------------------------

             Summary: Unreachable node can prevent remaining nodes from gaining 
quorum
                 Key: ZOOKEEPER-3149
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3149
             Project: ZooKeeper
          Issue Type: Bug
          Components: leaderElection
    Affects Versions: 3.4.12
            Reporter: Andrew January


Steps to reproduce:
 # Have a 3 node cluster set up, with node 2 as the leader, and node 3 zxid 
ahead of node 1 such that node 3 will be the new leader when node 2 disappears.
 # Shut down node 2 such that it is unreachable and attempts to connect to it 
yield a socket timeout.
 # Have the remaining two nodes get "Connection refused" responses quicker than 
1/5th of cnxTimeout (either by having a fast network or by increasing the value 
of cnxTimeout. On our system, they were happening just faster than 1/5th of the 
default 5s).

Expected behaviour:

The remaining nodes reach quorum.

Actual behaviour:

The remaining nodes repeatedly fail to reach quorum, spinning and holding 
elections until node 2 is brought back.

 

This is because:
 # An election for a new leader starts.
 # Both nodes broadcast notifications to all the other nodes
 # The notifications are sent to node 1 quickly, then it tries to send it to 
node 2, which takes cnxTimeout (default 5s) before timing out, then sends it to 
node 3. This results in all the notifications to node 3 taking 5 seconds to 
arrive.
 # Despite the delays, node 1 and node 3 agree that node 3 should be leader.
 # node 1 sends the message that it will follow node 3, then immediately tries 
to connect to it as leader.
 # Because of the delay, node 3 hasn't yet received the notification that node 
1 is following it, so doesn't start accepting requests.
 # This causes the requests from node 1 to fail quickly with "Connection 
refused".
 # It retries 5 times.
 # Because (by the nature of the setup) these connection refused are happening 
quicker than 1/5th of cnxTimeout, node 1 gives up trying to follow node 3 and 
starts a new election.
 # Node 3 times out waiting for node 1 to acknowledge it as leader, and starts 
a new election.

 

We can work around the issue by decreasing cnxTimeout to be less than 5 times 
the time it takes for us to get "Connection refused". However, it seems like a 
bad idea to rely on tweaking a value based on network performance, especially 
as the value is only configurable via JVM args rather than the conf files.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to