Esempio n. 1
0
        public Task SendAsync(byte[] data, RedisRole commandRole)
        {
            ValidateNotDisposed();
            ValidateRole(commandRole);

            var socket = Connect();

            if (socket == null)
            {
                SetLastError((long)SocketError.NotConnected);
                SetState((long)RedisConnectionState.Failed);

                throw new RedisFatalException(new SocketException((int)SocketError.NotConnected), RedisErrorCode.ConnectionError);
            }

            var task = socket.SendAsync(data, 0, data.Length);

            task.ContinueWith((asyncTask) =>
            {
                if (asyncTask.IsFaulted && asyncTask.Exception.IsSocketError())
                {
                    FreeAndNilSocket();
                }
            });
            return(task);
        }
Esempio n. 2
0
 internal RedisContinuousReaderConnection(string name, RedisRole expectedRole, RedisPoolSettings settings,
                                          Action <IRedisRawResponse> onReceiveResponse, Action <RedisConnection, RedisSocket> onCreateSocket,
                                          Action <RedisConnection, RedisSocket> onReleaseSocket, RedisSocket socket = null, bool connectImmediately = true)
     : base(name, expectedRole, settings, onCreateSocket, onReleaseSocket, socket, connectImmediately)
 {
     m_OnReceiveResponse = onReceiveResponse;
 }
Esempio n. 3
0
 public RedisManagedServer(RedisManagerSettings settings, RedisRole role,
                           Action <object, RedisCardioPulseStatus> onPulseStateChange)
     : base(settings)
 {
     Role = role;
     m_OnPulseStateChange = onPulseStateChange;
 }
        public override RedisRawResponse SendReceive(byte[] data, RedisRole commandRole)
        {
            ValidateNotDisposed();
            ValidateRole(commandRole);

            var socket = Connect();

            if (socket == null)
            {
                SetLastError((long)SocketError.NotConnected);
                SetState((long)RedisConnectionState.Failed);

                throw new RedisFatalException(new SocketException((int)SocketError.NotConnected), RedisErrorCode.ConnectionError);
            }

            var task = socket.SendAsync(data, 0, data.Length)
                       .ContinueWith <RedisRawResponse>((asyncTask) =>
            {
                if (asyncTask.IsFaulted && asyncTask.Exception.IsSocketError())
                {
                    FreeAndNilSocket();
                    return(null);
                }

                if (asyncTask.IsCompleted && asyncTask.Result > 0)
                {
                    using (var reader = new RedisSingleResponseReader(Settings))
                        return(reader.Execute(socket));
                }
                return(null);
            });

            return(task.Result);
        }
Esempio n. 5
0
 protected internal RedisManagedServer(RedisAsyncClient client, RedisConnectionSettings settings, RedisRole role,
                                       Action <object, RedisCardioPulseStatus> onPulseStateChange)
     : base(client, settings)
 {
     Role = role;
     m_OnPulseStateChange = onPulseStateChange;
 }
Esempio n. 6
0
 protected override void OnBeforeConnect(int dbIndex, RedisRole expectedRole)
 {
     if (IsDown)
     {
         throw new RedisFatalException("Pool is down");
     }
 }
Esempio n. 7
0
 public RedisNodeInfo(RedisEndPoint endPoint, RedisRole role, string name = null)
     : this()
 {
     Role     = role;
     Name     = name ?? String.Empty;
     EndPoint = endPoint ?? RedisEndPoint.Empty;
 }
Esempio n. 8
0
 public RedisManagedServerGroup(RedisManagerSettings settings, RedisRole role,
                                RedisManagedServerNode[] nodes, Action <object, RedisCardioPulseStatus> onPulseStateChange)
     : base(settings, role, nodes, onPulseStateChange)
 {
     if (!(role == RedisRole.Slave || role == RedisRole.Master))
     {
         throw new RedisException("Role must be master or slave");
     }
 }
Esempio n. 9
0
        protected RedisManagedNode(RedisManagerSettings settings, RedisRole role, object seed,
                                   Action <object, RedisCardioPulseStatus> onPulseStateChange, bool ownsSeed = true)
        {
            m_Seed     = seed;
            m_Role     = role;
            m_OwnsSeed = ownsSeed;
            m_EndPoint = RedisEndPoint.Empty;

            m_Settings           = settings;
            m_OnPulseStateChange = onPulseStateChange;
        }
Esempio n. 10
0
 public RedisManagedServerNode(RedisManagerSettings settings, RedisRole role, RedisManagedServer server,
                               Action <object, RedisCardioPulseStatus> onPulseStateChange, bool ownsSeed = true)
     : base(settings, role, server, onPulseStateChange, ownsSeed)
 {
     m_OnPulseStateChange = onPulseStateChange;
     m_EndPoint           = (server != null) ? server.EndPoint : RedisEndPoint.Empty;
     if (server != null)
     {
         server.SetOnPulseStateChange(onPulseStateChange);
     }
 }
Esempio n. 11
0
        public RedisManagedPoolNode(RedisManagerSettings settings, RedisRole role, RedisManagedPool pool,
                                    Action <object, RedisCardioPulseStatus> onPulseStateChange, bool ownsSeed = true)
            : base(settings, role, pool, onPulseStateChange, ownsSeed)
        {
            m_EndPoint = (pool != null) ? pool.EndPoint : RedisEndPoint.Empty;

            if (pool != null)
            {
                pool.PoolPulseStateChanged   += OnPoolPulseStateChange;
                pool.PubSubPulseStateChanged += OnPubSubPulseStateChange;
            }
        }
Esempio n. 12
0
        protected internal override IRedisConnection Connect(int dbIndex, RedisRole expectedRole)
        {
            ValidateNotDisposed();

            var connection = m_Connection;

            if (connection.IsAlive())
            {
                return(connection);
            }

            return(base.Connect(dbIndex, expectedRole));
        }
        protected override RedisSocket DequeueSocket(int dbIndex, RedisRole expectedRole)
        {
            var socket = m_Socket;

            lock (m_SocketLock)
            {
                if (socket != null && !socket.IsConnected())
                {
                    Interlocked.Exchange(ref m_Socket, null);
                    socket = null;
                }
            }
            return(socket);
        }
Esempio n. 14
0
 protected virtual void ValidateRole(RedisRole commandRole)
 {
     if (!(commandRole == RedisRole.Undefined || commandRole == RedisRole.Any))
     {
         var serverRole = ServerRole;
         if (serverRole != RedisRole.Any && serverRole != commandRole &&
             (serverRole == RedisRole.Sentinel || commandRole == RedisRole.Sentinel ||
              (serverRole == RedisRole.Slave && commandRole == RedisRole.Master)))
         {
             throw new RedisException(String.Format("Connected server's {0} role does not satisfy the command's desired {1} role",
                                                    serverRole.ToString("F"), commandRole.ToString("F")), RedisErrorCode.NotSupported);
         }
     }
 }
        private RedisManagedNodesGroup ToNodesGroup(RedisRole role, RedisSocket[] sockets)
        {
            if (!sockets.IsEmpty())
            {
                var baseSettings = Settings;
                var nodeList     = new List <RedisManagedNode>();
                foreach (var socket in sockets)
                {
                    try
                    {
                        if (socket.IsConnected())
                        {
                            var endPoint = socket.RemoteEP;
                            var settings = (RedisManagerSettings)baseSettings.Clone(endPoint.Address.ToString(), endPoint.Port);

                            if (role == RedisRole.Sentinel)
                            {
                                var listener = new RedisManagedSentinelListener(settings, null, null);
                                listener.ReuseSocket(socket);

                                nodeList.Add(new RedisManagedSentinelNode(settings, listener, null));
                            }
                            else
                            {
                                var pool = new RedisManagedPool(role, Name, settings);
                                pool.ReuseSocket(socket);

                                nodeList.Add(new RedisManagedPoolNode(settings, role, pool, null));
                            }
                        }
                    }
                    catch (Exception)
                    {
                        socket.DisposeSocket();
                    }
                }

                if (nodeList.Count > 0)
                {
                    var settings = (RedisManagerSettings)Settings;

                    return(role != RedisRole.Sentinel ?
                           (RedisManagedNodesGroup)(new RedisManagedPoolGroup(settings, role, nodeList.Cast <RedisManagedPoolNode>().ToArray(), null)) :
                           new RedisManagedSentinelGroup(settings, settings.MasterName, nodeList.Cast <RedisManagedSentinelNode>().ToArray(), null));
                }
            }
            return(null);
        }
Esempio n. 16
0
 internal RedisDbConnection(string name, RedisRole expectedRole, RedisConnectionSettings settings,
                            Action <RedisConnection, RedisSocket> onCreateSocket, Action <RedisConnection, RedisSocket> onReleaseSocket,
                            int dbIndex, RedisSocket socket = null, bool connectImmediately = false)
     : base(name, expectedRole, settings, onCreateSocket, onReleaseSocket, socket, false)
 {
     m_DbIndex = Math.Min(Math.Max(dbIndex, RedisConstants.UninitializedDbIndex), RedisConstants.MaxDbIndex);
     try
     {
         if (connectImmediately)
         {
             ConnectInternal();
         }
     }
     catch (Exception)
     { }
     SelectDB(m_DbIndex);
 }
Esempio n. 17
0
        protected virtual IRedisConnection Connect(RedisRole role, bool beginReveive = false)
        {
            ValidateNotDisposed();

            var connectionProvider = m_ConnectionProvider;

            if (connectionProvider != null)
            {
                var connection = connectionProvider.Connect(-1, role);

                if (connection != null && !connection.Connected)
                {
                    connection.Connect();
                }

                OnConnect(connection, beginReveive);

                return(connection);
            }
            return(null);
        }
Esempio n. 18
0
        internal RedisConnection(string name,
                                 RedisRole expectedRole, RedisConnectionSettings settings,
                                 Action <RedisConnection, RedisSocket> onCreateSocket,
                                 Action <RedisConnection, RedisSocket> onReleaseSocket,
                                 RedisSocket socket = null, bool connectImmediately = false)
        {
            if (settings == null)
            {
                throw new RedisFatalException(new ArgumentNullException("settings"));
            }

            if (onReleaseSocket == null)
            {
                throw new RedisFatalException(new ArgumentNullException("onReleaseSocket"));
            }

            RedisConnectionStats.IncrInUseConnections();

            m_ExpectedRole  = expectedRole;
            m_Settings      = settings ?? RedisConnectionSettings.Default;
            m_CreateAction  = onCreateSocket;
            m_ReleaseAction = onReleaseSocket;
            m_Name          = !name.IsEmpty() ? name : (GetType().Name + ", " + m_Id.ToString());

            if ((socket != null) && socket.Connected)
            {
                m_Socket = socket;
                m_State  = (int)RedisConnectionState.Connected;
            }

            try
            {
                if (connectImmediately)
                {
                    ConnectInternal();
                }
            }
            catch (Exception)
            { }
        }
Esempio n. 19
0
        protected RedisManagedNodesGroup(RedisManagerSettings settings, RedisRole role,
                                         RedisManagedNode[] nodes, Action <object, RedisCardioPulseStatus> onPulseStateChange)
        {
            Role = role;
            m_OnPulseStateChange = onPulseStateChange;
            m_Nodes    = nodes ?? new RedisManagedNode[0];
            m_Settings = settings;

            if (nodes.IsEmpty())
            {
                m_NodeIndex = -1;
            }
            else
            {
                foreach (var node in nodes)
                {
                    if (node != null)
                    {
                        node.SetOnPulseStateChange(OnPulseStateChange);
                    }
                }
            }
        }
Esempio n. 20
0
        protected virtual void OnConnect()
        {
            var settings = m_Settings;

            Auth(settings.Password);
            SetClientName(settings.ClientName);

            if (!NeedsToDiscoverRole())
            {
                m_ServerRole = ExpectedRole;
            }
            else
            {
                var role = (m_ServerRole = DiscoverRole());
                ValidateRole(role);
            }

            var serverMode = (m_ServerMode = NeedsToDiscoverMode() ? DiscoverMode() : RedisServerMode.Standalone);

            if (serverMode == RedisServerMode.Cluster)
            {
                DiscoverClusterSlots();
            }
        }
Esempio n. 21
0
        protected override RedisSocket DequeueSocket(int dbIndex, RedisRole expectedRole)
        {
            var storeHasMember = false;

            lock (m_MemberStoreLock)
            {
                var member = m_MemberStoreTail;
                if (member != null)
                {
                    try
                    {
                        if (member.DbIndex == dbIndex)
                        {
                            storeHasMember = true;
                            if (expectedRole == RedisRole.Any ||
                                expectedRole == RedisRole.Undefined ||
                                member.Role == expectedRole)
                            {
                                var socket = member.ReleaseSocket();

                                m_MemberStoreTail = null;
                                if (socket.IsConnected())
                                {
                                    return(socket);
                                }

                                socket.DisposeSocket();
                            }
                        }
                    }
                    catch (Exception)
                    { }
                }
            }

            var store = m_MemberStore;

            if (store != null)
            {
                lock (m_MemberStoreLock)
                {
                    if (store.Count > 0)
                    {
                        RedisSocket socket = null;
                        RedisConnectionPoolMember member;

                        var node = store.First;
                        while (node != null)
                        {
                            var nextNode = node.Next;
                            try
                            {
                                member = node.Value;
                                if (member.DbIndex == dbIndex)
                                {
                                    storeHasMember = true;
                                    if (expectedRole == RedisRole.Any ||
                                        expectedRole == RedisRole.Undefined ||
                                        member.Role == expectedRole)
                                    {
                                        socket = member.ReleaseSocket();

                                        store.Remove(node);
                                        if (socket.IsConnected())
                                        {
                                            return(socket);
                                        }

                                        socket.DisposeSocket();
                                    }
                                }
                            }
                            catch (Exception)
                            { }
                            finally
                            {
                                node = nextNode;
                            }
                        }
                    }
                }
            }

            if (storeHasMember && expectedRole == RedisRole.Slave)
            {
                return(DequeueSocket(dbIndex, RedisRole.Master));
            }
            return(null);
        }
Esempio n. 22
0
        protected override IRedisConnection NewConnection(RedisSocket socket, int dbIndex, RedisRole expectedRole, bool connectImmediately = true)
        {
            var settings = (Settings as RedisPoolSettings) ?? RedisPoolSettings.Default;

            return(new RedisDbConnection(Name, expectedRole, settings, null, OnReleaseSocket, dbIndex,
                                         socket.IsConnected() ? socket : null, connectImmediately));
        }
Esempio n. 23
0
 protected override void ApplyRole(RedisRole role)
 {
 }
Esempio n. 24
0
 IRedisConnection IRedisConnectionProvider.Connect(int dbIndex, RedisRole expectedRole)
 {
     return(this.Connect(dbIndex, expectedRole));
 }
Esempio n. 25
0
 public NodeRoleAndSiblings(RedisRole role, RedisEndPoint[] siblings)
 {
     Role     = role;
     Siblings = siblings;
 }
Esempio n. 26
0
 public virtual RedisRawResponse SendReceive(byte[] data, RedisRole commandRole)
 {
     ValidateNotDisposed();
     throw new RedisFatalException("SendAndReceive is not supported by base connection. Use Send method for sending data.", RedisErrorCode.NotSupported);
 }
Esempio n. 27
0
        protected override IRedisConnection OnNewConnection(RedisSocket socket, int dbIndex, RedisRole role, bool connectImmediately = true)
        {
            var settings = (Settings as RedisPoolSettings) ?? RedisPoolSettings.Default;

            return(new RedisContinuousReaderConnection(Name, RedisRole.Master, settings,
                                                       OnReceiveResponse,
                                                       null,
                                                       OnReleaseSocket,
                                                       socket,
                                                       true));
        }
Esempio n. 28
0
 public RedisManagedPool(RedisRole role, string name, RedisPoolSettings settings)
     : base(name, settings)
 {
     Role = role;
 }
        protected override IRedisConnection OnNewConnection(RedisSocket socket, int dbIndex, RedisRole role, bool connectImmediately = true)
        {
            var settings = Settings as RedisSentinelSettings ?? RedisSentinelSettings.Default;

            return(new RedisSentinelConnection(Name, settings,
                                               null,
                                               OnReleaseSocket,
                                               socket,
                                               true));
        }
Esempio n. 30
0
 protected internal abstract IRedisConnection Connect(int dbIndex, RedisRole expectedRole);