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); } }