Exemple #1
0
        private void CheckElectionMajority()
        {
            LogMinorEvent("Num Votes now " + numVotes);
            if (numVotes >= config.Majority)
            {
                LogEvent("Elected leader of term " + currentTerm);
                ForeachConnection(c => c.SignalIncoming());                 //prevent disconnection
                votedFor    = null;
                state       = State.Leader;
                cfgChangeAt = DateTime.Now;
                lastCommit  = DateTime.Now;
                leader      = this;
                ClearRemoteInfo();
                Broadcast(new AppendEntries(this));
                nextActionAt = PreciseTime.Now + HEART_BEAT_TIMEOUT_NS;

                if (DebugState != null)
                {
                    DebugState.AssertLeaderMatch(log.Select(p => p.Entry), log.Offset);
                }

                if (commitCount != LogSize)
                {
                    Broadcast(new AppendEntries(this, commitCount + 1));
                    ForeachConnection(c => c.ConsensusState.AppendTimeout = GetAppendMessageTimeout());
                }

                OnConsensusChange(Status.Leader, leader);
            }
        }