コード例 #1
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: public org.neo4j.causalclustering.core.consensus.log.RaftLogEntry get(long logIndex) throws java.io.IOException
        public virtual RaftLogEntry Get(long logIndex)
        {
            RaftLogEntry entry = null;

            if (_useCache)
            {
                entry = _inFlightCache.get(logIndex);
            }

            if (entry == null)
            {
                /*
                 * N.B.
                 * This fallback code is strictly necessary since getUsingCursor() requires
                 * that entries are accessed in strictly increasing order using a single cursor.
                 */
                _useCache = false;
                entry     = GetUsingCursor(logIndex);
            }

            if (_pruneAfterRead)
            {
                _inFlightCache.prune(logIndex);
            }

            return(entry);
        }
コード例 #2
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldEncodeAndDecodeAppendEntriesRequest()
        public virtual void ShouldEncodeAndDecodeAppendEntriesRequest()
        {
            // given
            MemberId     member   = new MemberId(System.Guid.randomUUID());
            RaftLogEntry logEntry = new RaftLogEntry(1, ReplicatedInteger.valueOf(1));

            Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request request = new Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request(member, 1, 1, 99, new RaftLogEntry[] { logEntry }, 1);

            // when
            _channel.writeOutbound(request);
            object message = _channel.readOutbound();

            _channel.writeInbound(message);

            // then
            assertEquals(request, _channel.readInbound());
        }
コード例 #3
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: private void raftMessageEquals(org.neo4j.causalclustering.core.consensus.RaftMessages_RaftMessage raftMessage, org.neo4j.causalclustering.core.consensus.RaftMessages_RaftMessage message) throws Exception
        private void RaftMessageEquals(Org.Neo4j.causalclustering.core.consensus.RaftMessages_RaftMessage raftMessage, Org.Neo4j.causalclustering.core.consensus.RaftMessages_RaftMessage message)
        {
            if (raftMessage is Org.Neo4j.causalclustering.core.consensus.RaftMessages_NewEntry_Request)
            {
                assertEquals(message.From(), raftMessage.From());
                assertEquals(message.Type(), raftMessage.Type());
                ContentEquals(((Org.Neo4j.causalclustering.core.consensus.RaftMessages_NewEntry_Request)raftMessage).Content(), ((Org.Neo4j.causalclustering.core.consensus.RaftMessages_NewEntry_Request)raftMessage).Content());
            }
            else if (raftMessage is Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request)
            {
                assertEquals(message.From(), raftMessage.From());
                assertEquals(message.Type(), raftMessage.Type());
                RaftLogEntry[] entries1 = ((Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request)raftMessage).Entries();
                RaftLogEntry[] entries2 = ((Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request)message).Entries();
                for (int i = 0; i < entries1.Length; i++)
                {
                    RaftLogEntry raftLogEntry1 = entries1[i];
                    RaftLogEntry raftLogEntry2 = entries2[i];
                    assertEquals(raftLogEntry1.Term(), raftLogEntry2.Term());
                    ContentEquals(raftLogEntry1.Content(), raftLogEntry2.Content());
                }
            }
        }
コード例 #4
0
        private void SendRange(long startIndex, long endIndex, LeaderContext leaderContext)
        {
            if (startIndex > endIndex)
            {
                return;
            }

            _lastSentIndex = endIndex;

            try
            {
                int            batchSize = ( int )(endIndex - startIndex + 1);
                RaftLogEntry[] entries   = new RaftLogEntry[batchSize];

                long prevLogIndex = startIndex - 1;
                long prevLogTerm  = _raftLog.readEntryTerm(prevLogIndex);

                if (prevLogTerm > leaderContext.Term)
                {
                    _log.warn("%s aborting send. Not leader anymore? %s, prevLogTerm=%d", StatusAsString(), leaderContext, prevLogTerm);
                    return;
                }

                bool entryMissing = false;
                using (InFlightLogEntryReader logEntrySupplier = new InFlightLogEntryReader(_raftLog, _inFlightCache, false))
                {
                    for (int offset = 0; offset < batchSize; offset++)
                    {
                        entries[offset] = logEntrySupplier.Get(startIndex + offset);
                        if (entries[offset] == null)
                        {
                            entryMissing = true;
                            break;
                        }
                        if (entries[offset].Term() > leaderContext.Term)
                        {
                            _log.warn("%s aborting send. Not leader anymore? %s, entryTerm=%d", StatusAsString(), leaderContext, entries[offset].Term());
                            return;
                        }
                    }
                }

                if (entryMissing || DoesNotExistInLog(prevLogIndex, prevLogTerm))
                {
                    if (_raftLog.prevIndex() >= prevLogIndex)
                    {
                        SendLogCompactionInfo(leaderContext);
                    }
                    else
                    {
                        _log.error("%s: Could not send compaction info and entries were missing, but log is not behind.", StatusAsString());
                    }
                }
                else
                {
                    Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request appendRequest = new Org.Neo4j.causalclustering.core.consensus.RaftMessages_AppendEntries_Request(_leader, leaderContext.Term, prevLogIndex, prevLogTerm, entries, leaderContext.CommitIndex);

                    _outbound.send(_follower, appendRequest);
                }
            }
            catch (IOException e)
            {
                _log.warn(StatusAsString() + " exception during batch send", e);
            }
        }
コード例 #5
0
 public AppendLogEntry(long index, RaftLogEntry entry)
 {
     this.Index = index;
     this.Entry = entry;
 }