private Node GetNodeFromDataReader(CqlDataReader reader, Logger logger) { //get address of new node, and fallback to listen_address when address is set to any var address = reader.GetIPAddress(reader.GetOrdinal("rpc_address")); if(address == null || address.Equals(IPAddress.Any)) address = reader.GetIPAddress(reader.GetOrdinal("peer")); var dc = reader.GetString(reader.GetOrdinal("data_center")); var rack = reader.GetString(reader.GetOrdinal("rack")); //check if we have an address, otherwise ignore if(address == null || dc == null || rack == null) { logger.LogError("Incomplete node information retrieved for a node: address={0}, dc={1}, rack={2}", address != null ? address.ToString() : "(address not found!)", dc ?? "(datacenter not found)", rack ?? "(rack not found)"); return null; } //get tokens var tokens = (reader.GetSet<string>(reader.GetOrdinal("tokens"))) ?? new HashSet<string>(); //distill protocol version from release version var release = reader.GetString(reader.GetOrdinal("release_version")); byte protocolVersion = DistillProtocolVersion(release); //create a new node return new Node(address, this) { DataCenter = dc, Rack = rack, Tokens = tokens, ProtocolVersion = protocolVersion }; }