Hi, I may be find a bug in the file
org.apache.zookeeper.server.quorum.FastLeaderElection.java when I read the
source code of Zookeeper. These codes as follow are copied from the file
between 255th and 282th line.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????boolean
backCompatibility40 = (capacity == 40);
response.buffer.clear();
// Instantiate Notification and set its attributes
Notification n = new Notification();
int rstate = response.buffer.getInt(); //4
long rleader = response.buffer.getLong(); //8
long rzxid = response.buffer.getLong(); //8
long relectionEpoch = response.buffer.getLong(); //8
long rpeerepoch;
int version = 0x0;
QuorumVerifier rqv = null;
try {
if (!backCompatibility28) {
rpeerepoch = response.buffer.getLong(); //8
if (!backCompatibility40) { // here may be a bug
/*
* Version added in 3.4.6
*/
version = response.buffer.getInt(); //4
} else {
LOG.info("Backward compatibility mode (36 bits), server id: {}",
response.sid);
}
} else {
LOG.info("Backward compatibility mode (28 bits), server id: {}",
response.sid);
rpeerepoch = ZxidUtils.getEpochFromZxid(rzxid);
}
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????The
variable "backCompatibility40 = (capacity == 40)", but "if
(!backCompatibility40) {version = response.buffer.getInt();}" The variable
response.buffer has been read 36 bytes before this line "if
(!backCompatibility40)". It should be "if (backCompatibility40)", then "version
= response.buffer.getInt()". It can be seen the log of "Backward compatibility
mode (36 bits)".Thank you for your reply and explain me if I am wrong.