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); } } } } }
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); }