Beispiel #1
0
        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");
            }
        }