private void HandleInitial(ClusterEvent.CurrentClusterState state) { _membersByAge = state.Members .Where(m => (m.Status == MemberStatus.Up || m.Status == MemberStatus.Leaving) && MatchingRole(m)) .ToImmutableSortedSet(MemberAgeOrdering.Descending); var safeToBeOldest = !state.Members.Any(m => m.Status == MemberStatus.Down || m.Status == MemberStatus.Exiting); var initial = new InitialOldestState(_membersByAge.FirstOrDefault()?.UniqueAddress, safeToBeOldest); _changes = _changes.Enqueue(initial); }
private void HandleInitial(ClusterEvent.CurrentClusterState state) { _membersByAge = state.Members .Where(m => (m.Status == MemberStatus.Up) && MatchingRole(m)) .ToImmutableSortedSet(MemberAgeOrdering.Descending); // If there is some removal in progress of an older node it's not safe to immediately become oldest, // removal of younger nodes doesn't matter. Note that it can also be started via restart after // ClusterSingletonManagerIsStuck. int selfUpNumber = state.Members.Where(m => m.UniqueAddress == _cluster.SelfUniqueAddress).Select(m => (int?)m.UpNumber).FirstOrDefault() ?? int.MaxValue; var safeToBeOldest = !state.Members.Any(m => (m.UpNumber < selfUpNumber && MatchingRole(m)) && (m.Status == MemberStatus.Down || m.Status == MemberStatus.Exiting || m.Status == MemberStatus.Leaving)); var initial = new InitialOldestState(_membersByAge.FirstOrDefault()?.UniqueAddress, safeToBeOldest); _changes = _changes.Enqueue(initial); }
private void HandleInitial(ClusterEvent.CurrentClusterState state) { _membersByAge = state.Members .Where(m => (m.Status == MemberStatus.Up || m.Status == MemberStatus.Leaving) && MatchingRole(m)) .ToImmutableSortedSet(MemberAgeOrdering.Descending); var safeToBeOldest = !state.Members.Any(m => m.Status == MemberStatus.Down || m.Status == MemberStatus.Exiting); var initial = new InitialOldestState(MemberAddressOrDefault(_membersByAge.FirstOrDefault()), safeToBeOldest); _changes = _changes.Enqueue(initial); }