internal ClusterNode(ClusterConfiguration configuration, string raw, EndPoint origin) { // http://redis.io/commands/cluster-nodes this.configuration = configuration; this.raw = raw; var parts = raw.Split(StringSplits.Space); var flags = parts[2].Split(StringSplits.Comma); endpoint = Format.TryParseEndPoint(parts[1]); nodeId = parts[0]; isSlave = flags.Contains("slave"); isNoAddr = flags.Contains("noaddr"); parentNodeId = string.IsNullOrWhiteSpace(parts[3]) ? null : parts[3]; List <SlotRange> slots = null; for (int i = 8; i < parts.Length; i++) { SlotRange range; if (SlotRange.TryParse(parts[i], out range)) { if (slots == null) { slots = new List <SlotRange>(parts.Length - i); } slots.Add(range); } } this.slots = slots == null ? NoSlots : slots.AsReadOnly(); this.isConnected = parts[7] == "connected"; // Can be "connected" or "disconnected" }
internal ClusterNode(ClusterConfiguration configuration, string raw, EndPoint origin) { // http://redis.io/commands/cluster-nodes this.configuration = configuration; this.Raw = raw; var parts = raw.Split(StringSplits.Space); var flags = parts[2].Split(StringSplits.Comma); // redis 4 changes the format of "cluster nodes" - adds @... to the endpoint var ep = parts[1]; int at = ep.IndexOf('@'); if (at >= 0) { ep = ep.Substring(0, at); } EndPoint = Format.TryParseEndPoint(ep); if (flags.Contains("myself")) { IsMyself = true; if (EndPoint == null) { // Unconfigured cluster nodes might report themselves as endpoint ":{port}", // hence the origin fallback value to make sure that we can address them EndPoint = origin; } } NodeId = parts[0]; IsSlave = flags.Contains("slave"); IsNoAddr = flags.Contains("noaddr"); ParentNodeId = string.IsNullOrWhiteSpace(parts[3]) ? null : parts[3]; List <SlotRange> slots = null; for (int i = 8; i < parts.Length; i++) { SlotRange range; if (SlotRange.TryParse(parts[i], out range)) { if (slots == null) { slots = new List <SlotRange>(parts.Length - i); } slots.Add(range); } } this.Slots = slots?.AsReadOnly() ?? NoSlots; this.IsConnected = parts[7] == "connected"; // Can be "connected" or "disconnected" }
internal ClusterNode(ClusterConfiguration configuration, string raw, EndPoint origin) { // http://redis.io/commands/cluster-nodes this.configuration = configuration; this.raw = raw; var parts = raw.Split(StringSplits.Space); var flags = parts[2].Split(StringSplits.Comma); endpoint = Format.TryParseEndPoint(parts[1]); if (flags.Contains("myself")) { isMyself = true; if (endpoint == null) { // Unconfigured cluster nodes might report themselves as endpoint ":{port}", // hence the origin fallback value to make sure that we can address them endpoint = origin; } } nodeId = parts[0]; isSlave = flags.Contains("slave"); isNoAddr = flags.Contains("noaddr"); parentNodeId = string.IsNullOrWhiteSpace(parts[3]) ? null : parts[3]; List <SlotRange> slots = null; for (int i = 8; i < parts.Length; i++) { SlotRange range; if (SlotRange.TryParse(parts[i], out range)) { if (slots == null) { slots = new List <SlotRange>(parts.Length - i); } slots.Add(range); } } this.slots = slots == null ? NoSlots : slots.AsReadOnly(); this.isConnected = parts[7] == "connected"; // Can be "connected" or "disconnected" }
internal ClusterNode(ClusterConfiguration configuration, string raw, EndPoint origin) { this.configuration = configuration; this.raw = raw; var parts = raw.Split(StringSplits.Space); var flags = parts[2].Split(StringSplits.Comma); if (flags.Contains("myself")) { endpoint = origin; } else { endpoint = Format.TryParseEndPoint(parts[1]); } nodeId = parts[0]; isSlave = flags.Contains("slave"); parentNodeId = string.IsNullOrWhiteSpace(parts[3]) ? null : parts[3]; List <SlotRange> slots = null; for (int i = 8; i < parts.Length; i++) { SlotRange range; if (SlotRange.TryParse(parts[i], out range)) { if (slots == null) { slots = new List <SlotRange>(parts.Length - i); } slots.Add(range); } } this.slots = slots == null ? NoSlots : slots.AsReadOnly(); }