private async Task AppendEntries(string node) { try { int index = Array.IndexOf(_nodes, node); var prevLog = _log.SingleOrDefault(l => l.Index == _nextIndex[index] - 1); if (_nextIndex[index] == _matchIndex[index]) { var request = new AppendEntriesArguments { Term = _currentTerm, LeaderId = NodeName, PrevLogIndex = prevLog?.Index ?? 0, PrevLogTerm = prevLog?.Term ?? 0, Entries = _log.Where(l => l.Index >= _nextIndex[index]).ToArray(), LeaderCommit = _commitIndex }; var result = await Communication.AppendEntriesAsync(node, request); } else { // Don't send actual logs until we know how up-to-date the node is var request = new AppendEntriesArguments { Term = _currentTerm, LeaderId = NodeName, PrevLogIndex = prevLog?.Index ?? 0, PrevLogTerm = prevLog?.Term ?? 0, LeaderCommit = _commitIndex }; var result = await Communication.AppendEntriesAsync(node, request); } } catch (Exception ex) { Log.Error(ex, "Error in RequestVote"); } }