public override IResponse TriggerEvent(IEvent triggeredEvent) { var appendEntriesEvent = triggeredEvent as AppendEntriesEvent; if (appendEntriesEvent != null) { bool leaderNodeWasChanged = false; lock (_ensureLogLock) { if (_consensusContext.NodeVote.LeaderNode == null || _consensusContext.NodeVote.LeaderNode.Id != appendEntriesEvent.LeaderNode.Id) { leaderNodeWasChanged = true; } _consensusContext.NodeVote.LeaderNode = appendEntriesEvent.LeaderNode; } _consensusContext.CurrentTerm = appendEntriesEvent.Term; _consensusContext.NodeVote.VoteTerm = 0; _lastRertievedHeartbeat = 0; if (leaderNodeWasChanged) { _consensusContext.EnsureLogConsistency(); } return(new AppendEntriesResponse(_consensusContext.CurrentTerm, true)); } var requestVoteEvent = triggeredEvent as RequestVoteEvent; if (requestVoteEvent != null) { _logger.LogInformation($"Retreived 'LeaderRequestEvent' event (currentTerm: {requestVoteEvent.Term}, node: {requestVoteEvent.Node.Id})."); bool voteValue = OtherNodeCanBeLeader(requestVoteEvent); if (voteValue) { _consensusContext.CurrentTerm = requestVoteEvent.Term; _consensusContext.NodeVote.LeaderNode = requestVoteEvent.Node; _consensusContext.NodeVote.VoteTerm = requestVoteEvent.Term; _lastRertievedHeartbeat = 0; _logger.LogInformation($"Voting for node ({requestVoteEvent.Node.Id}): GRANTED."); } else { _logger.LogInformation($"Voting for node ({requestVoteEvent.Node.Id}): NOT GRANTED."); } return(new RequestVoteResponse(voteValue, _consensusContext.CurrentTerm, _consensusContext.CurrentNode)); } return(new EmptyResponse()); }