public RequestVoteResult RequestVote(RequestVoteCommand request) { lock (_lock) { _auditLog.LogRecord(new AuditRecord(AuditRecordType.RecVoteRequest, Id, _state, _currentTerm, $"Requestor : {request.CandidateId}")); BecomeFollowerIfTermIsStale(request.CurrentTerm); if ((_votedFor == request.CandidateId || _votedFor == null) && request.CurrentTerm >= _currentTerm) { _auditLog.LogRecord(new AuditRecord(AuditRecordType.AcceptVoteRequest, Id, _state, _currentTerm)); _votedFor = request.CandidateId; return(new RequestVoteResult { Term = _currentTerm, VoteGranted = true, VoterId = Id }); } else { _auditLog.LogRecord(new AuditRecord(AuditRecordType.RejectVoteRequest, Id, _state, _currentTerm)); return(new RequestVoteResult { Term = _currentTerm, VoteGranted = false }); } } }
public async Task <RequestVoteResult> RequestVote(RequestVoteCommand request) { if (_rand.NextDouble() < _timeoutPct) { await Task.Delay(-1); } return(await _proxy.RequestVote(request)); }
public async Task <RequestVoteResult> RequestVote(RequestVoteCommand request) { if (_rand.NextDouble() < _exceptionPct) { throw new Exception("Network related exception"); } return(await _proxy.RequestVote(request)); }
public async Task <RequestVoteResult> RequestVote(RequestVoteCommand request) { //TODO base interface for all requests including SenderId //TODO Factory for proxies, most can be constructed in an AOP type fashion if (_config.Reachable(request.CandidateId, _proxy.Id)) { return(await _proxy.RequestVote(request)); } throw new Exception("Network related exception"); }
public Task <RequestVoteResult> RequestVote(RequestVoteCommand request) { return(Utility.AddLatency(_server.RequestVote, request, _latency)); }