Exemplo n.º 1
0
 private void AdvanceTerm()
 {
     Term++;
     Status = ClusterStatus.Turmoil;
     Tock   = 0;
     InboundAssignments.Clear();
 }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
 public FollowerAssignment GetAssignment(string followerId)
 {
     return(InboundAssignments.FirstOrDefault(x => x.FollowerId == followerId));
 }