private void AdvanceTerm() { Term++; Status = ClusterStatus.Turmoil; Tock = 0; InboundAssignments.Clear(); }
public void CommandFollowers(List <Followership> followers) { Tock++; followers = followers .Where(IsObedientFollower) .OrderBy(x => x.FollowerId) .ToList(); var differences = new HashSet <string>(followers.Select(x => x.FollowerId)); differences.SymmetricExceptWith(InboundAssignments.Select(x => x.FollowerId)); if (differences.Any() && Status == ClusterStatus.Harmony) { AdvanceTerm(); } if (!followers.Any()) { return; } if (differences.Any()) { var range = byte.MaxValue / followers.Count; //match MaxValue to TransportMessage ClaimTicket var remainder = byte.MaxValue - (range * followers.Count); InboundAssignments = followers .Select((follower, i) => new FollowerAssignment { FollowerId = follower.FollowerId, LowerBound = i * range + (i == 0 ? 0 : 1), UpperBound = (i * range) + range + (i == followers.Count - 1 ? remainder : 0) }) .ToList(); OutboundAssignment = followers.First().FollowerId; } Status = followers.All(x => x.Term == Term) ? ClusterStatus.Harmony : ClusterStatus.Turmoil; }
public FollowerAssignment GetAssignment(string followerId) { return(InboundAssignments.FirstOrDefault(x => x.FollowerId == followerId)); }