public NodeConnectivity(ByteBuf buf) { endpoint = ICorfuPayload.fromBuffer(buf, String.class); type = NodeConnectivityType.valueOf(ICorfuPayload.fromBuffer(buf, String.class)); Map<String, ConnectionStatus> connectivityMap = new HashMap<>(); ICorfuPayload .mapFromBuffer(buf, String.class, String.class) //transform map of strings to map of ConnectionStatus-es .forEach((node, status) -> connectivityMap.put(node, ConnectionStatus.valueOf(status))); connectivity = ImmutableMap.copyOf(connectivityMap); }
/** * Helper method to build local {@link NodeState} based on pings * * @param allServers all servers in the cluster * @param allConnectedNodes all connected nodes in the cluster * @param epoch current epoch * @param sequencerMetrics metrics * @return local node state */ private NodeState getLocalNodeState(Set<String> allServers, Set<String> allConnectedNodes, long epoch, SequencerMetrics sequencerMetrics) { //Get connectivity status for a local node Map<String, ConnectionStatus> connectivity = new HashMap<>(); allServers.forEach(server -> { connectivity.put(server, ConnectionStatus.fromBool(allConnectedNodes.contains(server))); }); NodeConnectivity localConnectivity = NodeConnectivity.connectivity( localEndpoint, ImmutableMap.copyOf(connectivity) ); return NodeState.builder() .connectivity(localConnectivity) .heartbeat(new HeartbeatTimestamp(epoch, heartbeatCounter.incrementHeartbeat())) .sequencerMetrics(sequencerMetrics) .build(); }
@Override public void doSerialize(ByteBuf buf) { ICorfuPayload.serialize(buf, endpoint); ICorfuPayload.serialize(buf, type.name()); Map<String, String> connectivityStrings = new HashMap<>(); connectivity.forEach((node, state) -> connectivityStrings.put(node, state.name())); ICorfuPayload.serialize(buf, connectivityStrings); }