protected GroupedSockets CreateGroupSockets() { if (!Disposed) { var settings = m_Settings; var ipEPList = RedisEndPoint.ToIPEndPoints(settings.EndPoints); if (ipEPList != null && ipEPList.Count > 0) { var ipEPSettings = ipEPList .Select(ep => (RedisPoolSettings)settings.Clone(ep.Address.ToString(), ep.Port)) .ToArray(); if (!ipEPSettings.IsEmpty()) { var discoveredEndPoints = new HashSet <IPEndPoint>(); var emptyTuple = new Tuple <RedisRole, RedisSocket> [0]; var groupsTuples = ipEPSettings .SelectMany(setting => CreateNodes(discoveredEndPoints, setting) ?? emptyTuple) .Where(node => node != null) .GroupBy( tuple => tuple.Item1, tuple => tuple.Item2, (role, group) => new Tuple <RedisRole, RedisSocket[]>(role, group.ToArray())) .ToList(); if (!groupsTuples.IsEmpty()) { // 0: Masters, 1: Slaves, 2: Sentinels const int MastersPos = 0, SlavesPos = 1, SentinelsPos = 2; var result = new RedisSocket[3][]; foreach (var tuple in groupsTuples) { switch (tuple.Item1) { case RedisRole.Master: result[MastersPos] = tuple.Item2; break; case RedisRole.Slave: result[SlavesPos] = tuple.Item2; break; case RedisRole.Sentinel: result[SentinelsPos] = tuple.Item2; break; default: break; } } return(new GroupedSockets(result[MastersPos], result[SlavesPos], result[SentinelsPos])); } } } } return(null); }