Exemple #1
0
 protected void EnqueueSocket(RedisSocket socket)
 {
     if (socket.IsAlive())
     {
         var member = new RedisConnectionPoolMember(socket, socket.DbIndex, Settings);
         lock (m_MemberStoreLock)
         {
             var prevTail = Interlocked.Exchange(ref m_MemberStoreTail, member);
             if (prevTail != null)
             {
                 var store = m_MemberStore;
                 if (store != null)
                 {
                     store.AddLast(prevTail);
                 }
             }
         }
     }
 }
Exemple #2
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);
        }