Пример #1
0
        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
                    });
                }
            }
        }
Пример #2
0
 public async Task <RequestVoteResult> RequestVote(RequestVoteCommand request)
 {
     if (_rand.NextDouble() < _timeoutPct)
     {
         await Task.Delay(-1);
     }
     return(await _proxy.RequestVote(request));
 }
Пример #3
0
 public async Task <RequestVoteResult> RequestVote(RequestVoteCommand request)
 {
     if (_rand.NextDouble() < _exceptionPct)
     {
         throw new Exception("Network related exception");
     }
     return(await _proxy.RequestVote(request));
 }
Пример #4
0
 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");
 }
Пример #5
0
 public Task <RequestVoteResult> RequestVote(RequestVoteCommand request)
 {
     return(Utility.AddLatency(_server.RequestVote, request, _latency));
 }