예제 #1
0
 public override void UnregisterListener(LeaderListener listener)
 {
     lock (this)
     {
         _leaderListeners.remove(listener);
     }
 }
예제 #2
0
        private static ThreadStart LeaderViewUpdatingListener(RaftMachine raft, IEnumerable <RaftMachine> validRafts, IDictionary <MemberId, MemberId> leaderViews, long viewCount, CompletableFuture <MemberId> futureAgreedLeader)
        {
            LeaderListener listener = newLeader =>
            {
                lock ( leaderViews )
                {
                    leaderViews[raft.Identity()] = newLeader.memberId();

                    bool leaderIsValid = false;
                    foreach (RaftMachine validRaft in validRafts)
                    {
                        if (validRaft.Identity().Equals(newLeader.memberId()))
                        {
                            leaderIsValid = true;
                        }
                    }

                    if (newLeader.memberId() != null && leaderIsValid && AllAgreeOnLeader(leaderViews, viewCount, newLeader.memberId()))
                    {
                        futureAgreedLeader.complete(newLeader.memberId());
                    }
                }
            };

            raft.RegisterListener(listener);
            return(() => raft.unregisterListener(listener));
        }
예제 #3
0
 public override void RegisterListener(LeaderListener listener)
 {
     lock (this)
     {
         _leaderListeners.Add(listener);
         listener.OnLeaderSwitch(_state.leaderInfo());
     }
 }