Ejemplo n.º 1
0
        public RedisResult <RedisRoleInfo> Role()
        {
            var raw = ExpectArray(RedisCommandList.Role);

            if (!ReferenceEquals(raw, null))
            {
                var result = RedisRoleInfo.Parse(raw.Value);
                return(new RedisResult <RedisRoleInfo>(result));
            }
            return(new RedisResult <RedisRoleInfo>(null));
        }
Ejemplo n.º 2
0
        protected virtual RedisRole DiscoverRole(RedisSocket socket)
        {
            if (!Disposed)
            {
                var role = RedisRole.Undefined;
                try
                {
                    using (var cmd = new RedisCommand(-1, RedisCommandList.Role, RedisCommandType.SendAndReceive))
                    {
                        var raw = cmd.ExpectArray(new RedisSocketContext(socket, Settings), true);
                        if (!ReferenceEquals(raw, null) && raw.IsCompleted)
                        {
                            var info = RedisRoleInfo.Parse(raw.Value);
                            if (!ReferenceEquals(info, null))
                            {
                                role = info.Role;
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    var exception = e;
                    while (exception != null)
                    {
                        if (exception is SocketException)
                        {
                            return(RedisRole.Undefined);
                        }

                        var re = e as RedisException;
                        if (re != null && (re.ErrorCode == RedisErrorCode.ConnectionError ||
                                           re.ErrorCode == RedisErrorCode.SocketError))
                        {
                            return(RedisRole.Undefined);
                        }

                        exception = exception.InnerException;
                    }
                }

                if (role == RedisRole.Undefined)
                {
                    try
                    {
                        var serverInfo = GetServerInfo();
                        if (serverInfo != null)
                        {
                            var serverSection = serverInfo.Server;
                            if (serverSection != null)
                            {
                                role = (serverSection.RedisMode ?? String.Empty).Trim().ToRedisRole();
                            }

                            if (role == RedisRole.Undefined)
                            {
                                var replicationSection = serverInfo.Replication;
                                if (replicationSection != null)
                                {
                                    role = (replicationSection.Role ?? String.Empty).Trim().ToRedisRole();
                                }

                                if (role == RedisRole.Undefined)
                                {
                                    var sentinelSection = serverInfo.Sentinel;
                                    if (sentinelSection != null && sentinelSection.SentinelMasters.HasValue)
                                    {
                                        role = RedisRole.Sentinel;
                                    }

                                    if (role == RedisRole.Undefined)
                                    {
                                        role = RedisRole.Master;
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception)
                    { }
                }

                socket.Role = role;
                return(role);
            }
            return(RedisRole.Undefined);
        }