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"
        }
예제 #2
0
        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"
        }
예제 #3
0
        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();
        }