RATIS-137. RaftBasicTests.testBasicAppendEntries may fail.  Contributed by 
Lokesh Jain


Project: http://git-wip-us.apache.org/repos/asf/incubator-ratis/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ratis/commit/7f179431
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ratis/tree/7f179431
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ratis/diff/7f179431

Branch: refs/heads/master
Commit: 7f17943166b7c57ad0202aa796cf2a9271695a90
Parents: 7919c20
Author: Tsz-Wo Nicholas Sze <[email protected]>
Authored: Sat Nov 11 14:17:37 2017 -0800
Committer: Tsz-Wo Nicholas Sze <[email protected]>
Committed: Sat Nov 11 14:17:37 2017 -0800

----------------------------------------------------------------------
 .../java/org/apache/ratis/RaftBasicTests.java   | 12 ++----
 .../java/org/apache/ratis/RaftTestUtil.java     | 42 +++++++++++++++-----
 2 files changed, 35 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7f179431/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java 
b/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
index 0cd9222..2647d8f 100644
--- a/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
+++ b/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
@@ -130,10 +130,8 @@ public abstract class RaftBasicTests extends BaseTest {
     Thread.sleep(cluster.getMaxTimeout() + 100);
     LOG.info(cluster.printAllLogs());
 
-    cluster.getServerAliveStream()
-        .map(s -> s.getState().getLog())
-        .forEach(log -> RaftTestUtil.assertLogEntries(log,
-            log.getEntries(1, Long.MAX_VALUE), 1, term, messages));
+    cluster.getServerAliveStream().map(s -> s.getState().getLog())
+        .forEach(log -> RaftTestUtil.assertLogEntries(log, term, messages));
   }
 
   @Test
@@ -172,10 +170,8 @@ public abstract class RaftBasicTests extends BaseTest {
     final RaftPeerId newLeaderId = waitForLeader(cluster).getId();
     Assert.assertEquals(followerToSendLog.getId(), newLeaderId);
 
-    cluster.getServerAliveStream()
-            .map(s -> s.getState().getLog())
-            .forEach(log -> RaftTestUtil.assertLogEntries(log,
-                    log.getEntries(1, 2), 1, term, messages));
+    cluster.getServerAliveStream().map(s -> s.getState().getLog())
+        .forEach(log -> RaftTestUtil.assertLogEntries(log, term, messages));
     LOG.info("terminating testOldLeaderCommit test");
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7f179431/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java 
b/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
index 62545fe..d1e614c 100644
--- a/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
+++ b/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
@@ -40,9 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.BooleanSupplier;
 import java.util.function.IntSupplier;
 import java.util.function.Predicate;
@@ -167,18 +165,40 @@ public interface RaftTestUtil {
     }
   }
 
-  static void assertLogEntries(RaftLog log, TermIndex[] entries,
-      long startIndex, long expectedTerm, SimpleMessage... expectedMessages) {
-    Assert.assertEquals(expectedMessages.length, entries.length);
-    for(int i = 0; i < entries.length; i++) {
+  static void assertLogEntries(RaftLog log, long expectedTerm,
+      SimpleMessage... expectedMessages) {
+
+    final TermIndex[] termIndices = log.getEntries(1, Long.MAX_VALUE);
+    final List<LogEntryProto> entries = new 
ArrayList<>(expectedMessages.length);
+    for (TermIndex ti : termIndices) {
       final LogEntryProto e;
       try {
-        e = log.get(entries[i].getIndex());
+        e = log.get(ti.getIndex());
       } catch (IOException exception) {
-        throw new RuntimeException(exception);
+        throw new AssertionError("Failed to get log at " + ti, exception);
+      }
+
+      if (e.getLogEntryBodyCase() == 
LogEntryProto.LogEntryBodyCase.SMLOGENTRY) {
+        entries.add(e);
+      } else if (e.getLogEntryBodyCase() == 
LogEntryProto.LogEntryBodyCase.NOOP) {
+        LOG.info("Found " + LogEntryProto.LogEntryBodyCase.NOOP + " at " + ti
+            + ", ignoring it.");
+      } else {
+        throw new AssertionError(
+            "Unexpected LogEntryBodyCase " + e.getLogEntryBodyCase() + " at " 
+ ti);
+      }
+    }
+
+    long logIndex = 0;
+    Assert.assertEquals(expectedMessages.length, entries.size());
+    for (int i = 0; i < expectedMessages.length; i++) {
+      final LogEntryProto e = entries.get(i);
+      Assert.assertTrue(e.getTerm() >= expectedTerm);
+      if (e.getTerm() > expectedTerm) {
+        expectedTerm = e.getTerm();
       }
-      Assert.assertEquals(expectedTerm, e.getTerm());
-      Assert.assertEquals(startIndex + i, e.getIndex());
+      Assert.assertTrue(e.getIndex() > logIndex);
+      logIndex = e.getIndex();
       Assert.assertArrayEquals(expectedMessages[i].getContent().toByteArray(),
           e.getSmLogEntry().getData().toByteArray());
     }

Reply via email to