if (topologyChangeByte == 1)
readNewTopologyAndHash(transport, params.topologyId);
}
protected void readNewTopologyAndHash(Transport transport, AtomicInteger topologyId) {
final Log localLog = getLog();
int newTopologyId = transport.readVInt();
topologyId.set(newTopologyId);
int numKeyOwners = transport.readUnsignedShort();
short hashFunctionVersion = transport.readByte();
int hashSpace = transport.readVInt();
int clusterSize = transport.readVInt();
localLog.tracef("Topology change request: newTopologyId=%d, numKeyOwners=%d, " +
"hashFunctionVersion=%d, hashSpaceSize=%d, clusterSize=%d",
newTopologyId, numKeyOwners, hashFunctionVersion, hashSpace, clusterSize);
Map<SocketAddress, Set<Integer>> servers2Hash = new LinkedHashMap<SocketAddress, Set<Integer>>();
for (int i = 0; i < clusterSize; i++) {
String host = transport.readString();
int port = transport.readUnsignedShort();
int hashCode = transport.read4ByteInt();
localLog.tracef("Server read: %s:%d - hash code is %d", host, port, hashCode);
InetSocketAddress address = new InetSocketAddress(host, port);
Set<Integer> hashes = servers2Hash.get(address);
if (hashes == null) {
hashes = new HashSet<Integer>();
servers2Hash.put(address, hashes);
}
hashes.add(hashCode);
localLog.tracef("Hash code is: %d", hashCode);
}
if (localLog.isInfoEnabled()) {
localLog.newTopology(servers2Hash.keySet());
}
transport.getTransportFactory().updateServers(servers2Hash.keySet());
if (hashFunctionVersion == 0) {
localLog.trace("Not using a consistent hash function (hash function version == 0).");
} else {
transport.getTransportFactory().updateHashFunction(servers2Hash, numKeyOwners, hashFunctionVersion, hashSpace);
}
}