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)