public void MakeReportForLeader(Leadership leader, List <string> currentWork) { CurrentWork = currentWork; Tock++; if (leader.Term < Term) { LeaderTock = 0; return; } if (leader.Term > Term) { if (currentWork.Any()) { return; } Term = leader.Term; Tock = leader.Tock; LeaderTock = leader.Tock; } if (leader.Tock > LeaderTock) { Tock = leader.Tock; LeaderTock = leader.Tock; } }
void Lead() { using (var session = RavenFactory.OpenSession()) { session.Advanced.UseOptimisticConcurrency = true; var l = session.Advanced.Lazily.Load <Leadership>(Leadership.Identifier); var f = session.Advanced.Lazily.LoadStartingWith <Followership>(Followership.IdPrefix); session.Advanced.Eagerly.ExecuteAllPendingLazyOperations(); var leadership = l.Value; var followers = f.Value.ToList(); var me = followers.FirstOrDefault(x => x.FollowerId == ProcessIdentity); if (me == null) { return; } if (me.ConsideringCoup) { if (leadership == null) { leadership = new Leadership(); session.Store(leadership); } if (leadership.IsHumbleFollower(ProcessIdentity)) { leadership.UsurpPower(ProcessIdentity); session.SaveChanges(); //throw if someone else beats me //TODO: Log Won Election! } } if (leadership == null) { return; } if (leadership.IsHumbleFollower(ProcessIdentity)) { return; } leadership.CommandFollowers(followers); var dead = followers.Where(leadership.IsDeadFollower).ToList(); dead.ForEach(session.Delete); session.SaveChanges(); Console.WriteLine("counts... {0}, {1}", _workQueue.Count, InProgress.Count); } }