Repository: incubator-ratis
Updated Branches:
  refs/heads/master 96a3b1bfe -> 68bb4c918


RATIS-429. RaftReconfigurationTest fails intermittently.


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

Branch: refs/heads/master
Commit: 68bb4c9189659da48f2069f3f96754914bc20d30
Parents: 96a3b1b
Author: Tsz Wo Nicholas Sze <[email protected]>
Authored: Mon Nov 19 17:28:19 2018 -0800
Committer: Tsz Wo Nicholas Sze <[email protected]>
Committed: Mon Nov 19 17:28:19 2018 -0800

----------------------------------------------------------------------
 .../TestRaftReconfigurationWithHadoopRpc.java   |   7 +-
 .../java/org/apache/ratis/RaftTestUtil.java     |   4 +-
 .../impl/RaftReconfigurationBaseTest.java       | 189 ++++++++-----------
 .../ratis/server/impl/RaftServerTestUtil.java   |   7 +-
 .../grpc/TestRaftReconfigurationWithGrpc.java   |  11 +-
 .../netty/TestRaftReconfigurationWithNetty.java |  10 +-
 ...TestRaftReconfigurationWithSimulatedRpc.java |  10 +-
 7 files changed, 96 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/ratis-hadoop/src/test/java/org/apache/ratis/hadooprpc/TestRaftReconfigurationWithHadoopRpc.java
----------------------------------------------------------------------
diff --git 
a/ratis-hadoop/src/test/java/org/apache/ratis/hadooprpc/TestRaftReconfigurationWithHadoopRpc.java
 
b/ratis-hadoop/src/test/java/org/apache/ratis/hadooprpc/TestRaftReconfigurationWithHadoopRpc.java
index df432fc..000d47b 100644
--- 
a/ratis-hadoop/src/test/java/org/apache/ratis/hadooprpc/TestRaftReconfigurationWithHadoopRpc.java
+++ 
b/ratis-hadoop/src/test/java/org/apache/ratis/hadooprpc/TestRaftReconfigurationWithHadoopRpc.java
@@ -30,16 +30,17 @@ import static 
org.apache.hadoop.fs.CommonConfigurationKeysPublic.IPC_CLIENT_CONN
 import static 
org.apache.hadoop.fs.CommonConfigurationKeysPublic.IPC_CLIENT_CONNECT_TIMEOUT_KEY;
 
 public class TestRaftReconfigurationWithHadoopRpc
-    extends RaftReconfigurationBaseTest {
+    extends RaftReconfigurationBaseTest<MiniRaftClusterWithHadoopRpc>
+    implements MiniRaftClusterWithHadoopRpc.Factory.Get {
   static {
     ((Log4JLogger) Client.LOG).getLogger().setLevel(Level.ERROR);
   }
 
   @Override
-  public MiniRaftCluster getCluster(int peerNum) throws IOException {
+  public MiniRaftClusterWithHadoopRpc newCluster(int numPeers) {
     final Configuration hadoopConf = new Configuration();
     hadoopConf.setInt(IPC_CLIENT_CONNECT_TIMEOUT_KEY, 1000);
     hadoopConf.setInt(IPC_CLIENT_CONNECT_MAX_RETRIES_KEY, 0);
-    return MiniRaftClusterWithHadoopRpc.FACTORY.newCluster(peerNum, prop, 
hadoopConf);
+    return MiniRaftClusterWithHadoopRpc.FACTORY.newCluster(numPeers, 
getProperties(), hadoopConf);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/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 e4d9c8c..e305241 100644
--- a/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
+++ b/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
@@ -102,13 +102,13 @@ public interface RaftTestUtil {
     }
   }
 
-  static String waitAndKillLeader(MiniRaftCluster cluster) throws 
InterruptedException {
+  static RaftPeerId waitAndKillLeader(MiniRaftCluster cluster) throws 
InterruptedException {
     final RaftServerImpl leader = waitForLeader(cluster);
     Assert.assertNotNull(leader);
 
     LOG.info("killing leader = " + leader);
     cluster.killServer(leader.getId());
-    return leader.getId().toString();
+    return leader.getId();
   }
 
   static boolean logEntriesContains(RaftLog log, SimpleMessage... 
expectedMessages) {

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
 
b/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
index 7fde1c5..edb7565 100644
--- 
a/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
+++ 
b/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
@@ -25,7 +25,6 @@ import org.apache.ratis.RaftTestUtil;
 import org.apache.ratis.RaftTestUtil.SimpleMessage;
 import org.apache.ratis.client.RaftClient;
 import org.apache.ratis.client.RaftClientRpc;
-import org.apache.ratis.conf.RaftProperties;
 import org.apache.ratis.protocol.*;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.storage.RaftLog;
@@ -33,7 +32,6 @@ import org.apache.ratis.server.storage.RaftStorageTestUtils;
 import org.apache.ratis.util.JavaUtils;
 import org.apache.ratis.util.LogUtils;
 import org.junit.Assert;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.internal.util.reflection.Whitebox;
 
@@ -41,14 +39,19 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 import static java.util.Arrays.asList;
 import static 
org.apache.ratis.server.impl.RaftServerTestUtil.waitAndCheckNewConf;
 
-public abstract class RaftReconfigurationBaseTest extends BaseTest {
+public abstract class RaftReconfigurationBaseTest<CLUSTER extends 
MiniRaftCluster>
+    extends BaseTest
+    implements MiniRaftCluster.Factory.Get<CLUSTER> {
   static {
     LogUtils.setLogLevel(RaftServerImpl.LOG, Level.DEBUG);
     LogUtils.setLogLevel(RaftClient.LOG, Level.DEBUG);
@@ -59,19 +62,10 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
   private static final DelayLocalExecutionInjection leaderPlaceHolderDelay =
       new DelayLocalExecutionInjection(LeaderState.APPEND_PLACEHOLDER);
 
-  protected static final RaftProperties prop = new RaftProperties();
-  
   static final int STAGING_CATCHUP_GAP = 10;
-  @BeforeClass
-  public static void setup() {
-    // set a small gap for tests
-    RaftServerConfigKeys.setStagingCatchupGap(prop, STAGING_CATCHUP_GAP);
-  }
-
-  public abstract MiniRaftCluster getCluster(int peerNum) throws IOException;
 
-  private static int getStagingGap() {
-    return STAGING_CATCHUP_GAP;
+  {
+    RaftServerConfigKeys.setStagingCatchupGap(getProperties(), 
STAGING_CATCHUP_GAP);
   }
 
   /**
@@ -79,10 +73,7 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testAddPeers() throws Exception {
-    LOG.info("Start testAddPeers");
-    MiniRaftCluster cluster = getCluster(3);
-    cluster.start();
-    try {
+    runWithNewCluster(3, cluster -> {
       RaftTestUtil.waitForLeader(cluster);
 
       // add new peers
@@ -93,9 +84,7 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
 
       // wait for the new configuration to take effect
       waitAndCheckNewConf(cluster, allPeers, 0, null);
-    } finally {
-      cluster.shutdown();
-    }
+    });
   }
 
   /**
@@ -103,10 +92,7 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testRemovePeers() throws Exception {
-    LOG.info("Start testRemovePeers");
-    MiniRaftCluster cluster = getCluster(5);
-    cluster.start();
-    try {
+    runWithNewCluster(5, cluster -> {
       RaftTestUtil.waitForLeader(cluster);
 
       // remove peers, leader still included in the new conf
@@ -118,9 +104,7 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
 
       // wait for the new configuration to take effect
       waitAndCheckNewConf(cluster, allPeers, 2, null);
-    } finally {
-      cluster.shutdown();
-    }
+    });
   }
 
   /**
@@ -128,20 +112,15 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testAddRemovePeers() throws Exception {
-    LOG.info("Start testAddRemovePeers");
-    testAddRemovePeers(false);
+    runWithNewCluster(5, cluster -> runTestAddRemovePeers(false, cluster));
   }
 
   @Test
   public void testLeaderStepDown() throws Exception {
-    LOG.info("Start testLeaderStepDown");
-    testAddRemovePeers(true);
+    runWithNewCluster(5, cluster -> runTestAddRemovePeers(true, cluster));
   }
 
-  private void testAddRemovePeers(boolean leaderStepdown) throws Exception {
-    MiniRaftCluster cluster = getCluster(5);
-    cluster.start();
-    try {
+  private void runTestAddRemovePeers(boolean leaderStepdown, CLUSTER cluster) 
throws Exception {
       RaftTestUtil.waitForLeader(cluster);
 
       PeerChanges change = cluster.addNewPeers(2, true);
@@ -153,22 +132,19 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
 
       // wait for the new configuration to take effect
       waitAndCheckNewConf(cluster, allPeers, 2, null);
-    } finally {
-      cluster.shutdown();
-    }
   }
 
   @Test(timeout = 30000)
   public void testReconfTwice() throws Exception {
-    LOG.info("Start testReconfTwice");
-    final MiniRaftCluster cluster = getCluster(3);
-    cluster.start();
-    try {
+    runWithNewCluster(3, this::runTestReconfTwice);
+  }
+
+  void runTestReconfTwice(CLUSTER cluster) throws Exception {
       final RaftPeerId leaderId = RaftTestUtil.waitForLeader(cluster).getId();
       final RaftClient client = cluster.createClient(leaderId);
 
       // submit some msgs before reconf
-      for (int i = 0; i < getStagingGap() * 2; i++) {
+      for (int i = 0; i < STAGING_CATCHUP_GAP * 2; i++) {
         RaftClientReply reply = client.send(new SimpleMessage("m" + i));
         Assert.assertTrue(reply.isSuccess());
       }
@@ -218,25 +194,20 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
         // each reconf will generate two configurations: (old, new) and (new)
         // each leader change generates one configuration.
         // expectedConf = 1 (init) + 2*2 (two conf changes) + #leader
-        final int expechedConf = leader2.equals(leaderId)? 6: 7;
-        Assert.assertEquals(expechedConf, confManager.numOfConf());
+        final int expectedConf = leader2.equals(leaderId)? 6: 7;
+        Assert.assertEquals(server.getId() + ": " + confManager, expectedConf, 
confManager.numOfConf());
       });
-    } finally {
-      cluster.shutdown();
-    }
   }
 
   @Test
   public void testReconfTimeout() throws Exception {
-    LOG.info("Start testReconfTimeout");
     // originally 3 peers
-    final MiniRaftCluster cluster = getCluster(3);
-    cluster.start();
-    try {
-      RaftTestUtil.waitForLeader(cluster);
-      final RaftPeerId leaderId = cluster.getLeader().getId();
-      final RaftClient client = cluster.createClient(leaderId);
+    runWithNewCluster(3, this::runTestReconfTimeout);
+  }
 
+  void runTestReconfTimeout(CLUSTER cluster) throws Exception {
+    final RaftPeerId leaderId = RaftTestUtil.waitForLeader(cluster).getId();
+    try (final RaftClient client = cluster.createClient(leaderId)) {
       PeerChanges c1 = cluster.addNewPeers(2, false);
 
       LOG.info("Start changing the configuration: {}",
@@ -273,25 +244,22 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
         cluster.restartServer(np.getId(), false);
       }
       
Assert.assertTrue(client.setConfiguration(c1.allPeersInNewConf).isSuccess());
-      client.close();
-    } finally {
-      cluster.shutdown();
     }
   }
 
   @Test
   public void testBootstrapReconf() throws Exception {
-    LOG.info("Start testBootstrapReconf");
     // originally 3 peers
-    final MiniRaftCluster cluster = getCluster(3);
-    cluster.start();
-    try {
+    runWithNewCluster(3, this::runTestBootstrapReconf);
+  }
+
+  void runTestBootstrapReconf(CLUSTER cluster) throws Exception {
       RaftTestUtil.waitForLeader(cluster);
       final RaftPeerId leaderId = cluster.getLeader().getId();
       final RaftClient client = cluster.createClient(leaderId);
 
       // submit some msgs before reconf
-      for (int i = 0; i < getStagingGap() * 2; i++) {
+      for (int i = 0; i < STAGING_CATCHUP_GAP * 2; i++) {
         RaftClientReply reply = client.send(new SimpleMessage("m" + i));
         Assert.assertTrue(reply.isSuccess());
       }
@@ -322,9 +290,6 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
             cluster.getRaftServerImpl(newPeer.getId()).getState().getLog()
                 .getEntries(0, Long.MAX_VALUE));
       }
-    } finally {
-      cluster.shutdown();
-    }
   }
 
   /**
@@ -333,39 +298,42 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testKillLeaderDuringReconf() throws Exception {
-    LOG.info("Start testKillLeaderDuringReconf");
     // originally 3 peers
-    final MiniRaftCluster cluster = getCluster(3);
-    cluster.start();
+    runWithNewCluster(3, this::runTestKillLeaderDuringReconf);
+  }
+
+  void runTestKillLeaderDuringReconf(CLUSTER cluster) throws Exception {
     final AtomicBoolean clientRunning = new AtomicBoolean(true);
     Thread clientThread = null;
     try {
-      RaftTestUtil.waitForLeader(cluster);
-      final RaftPeerId leaderId = cluster.getLeader().getId();
-      final RaftClient client = cluster.createClient(leaderId);
+      final RaftPeerId leaderId = RaftTestUtil.waitForLeader(cluster).getId();
 
       PeerChanges c1 = cluster.addNewPeers(1, false);
       PeerChanges c2 = cluster.removePeers(1, false, asList(c1.newPeers));
 
-      LOG.info("Start changing the configuration: {}",
-          asList(c2.allPeersInNewConf));
-      final AtomicReference<Boolean> success = new AtomicReference<>();
+      LOG.info("Start setConf: {}", asList(c2.allPeersInNewConf));
+      LOG.info(cluster.printServers());
+
+      final CompletableFuture<Void> setConf = new CompletableFuture<>();
       clientThread = new Thread(() -> {
-        try {
-          boolean r = false;
-          while (clientRunning.get() && !r) {
-            r = client.setConfiguration(c2.allPeersInNewConf).isSuccess();
+        try(final RaftClient client = cluster.createClient(leaderId)) {
+          for(int i = 0; clientRunning.get() && !setConf.isDone(); i++) {
+            final RaftClientReply reply = 
client.setConfiguration(c2.allPeersInNewConf);
+            if (reply.isSuccess()) {
+              setConf.complete(null);
+            }
+            LOG.info("setConf attempt #{} failed, {}", i, 
cluster.printServers());
           }
-          success.set(r);
-          client.close();
-        } catch (IOException ignored) {
+        } catch(Exception e) {
+          LOG.error("Failed to setConf", e);
+          setConf.completeExceptionally(e);
         }
       });
       clientThread.start();
 
+      TimeUnit.SECONDS.sleep(1);
       // the leader cannot generate the (old, new) conf, and it will keep
       // bootstrapping the 2 new peers since they have not started yet
-      LOG.info(cluster.printServers());
       Assert.assertFalse(cluster.getLeader().getRaftConf().isTransitional());
 
       // only the first empty entry got committed
@@ -374,24 +342,29 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
       Assert.assertTrue("committedIndex is " + committedIndex,
           committedIndex <= 1);
 
-      LOG.info("kill the current leader");
-      final String oldLeaderId = RaftTestUtil.waitAndKillLeader(cluster);
+      final RaftPeerId killed = RaftTestUtil.waitAndKillLeader(cluster);
+      Assert.assertEquals(leaderId, killed);
+      final RaftPeerId newLeaderId = 
RaftTestUtil.waitForLeader(cluster).getId();
+      LOG.info("newLeaderId: {}", newLeaderId);
+
       LOG.info("start new peers: {}", Arrays.asList(c1.newPeers));
       for (RaftPeer np : c1.newPeers) {
         cluster.restartServer(np.getId(), false);
       }
 
-      Thread.sleep(3000);
-      // the client should get the NotLeaderException from the first leader, 
and
-      // will retry the same setConfiguration request
-      waitAndCheckNewConf(cluster, c2.allPeersInNewConf, 2,
-          Collections.singletonList(oldLeaderId));
+      try {
+        setConf.get(10, TimeUnit.SECONDS);
+      } catch(TimeoutException ignored) {
+      }
+
+      // the client fails with the first leader, and then retry the same 
setConfiguration request
+      waitAndCheckNewConf(cluster, c2.allPeersInNewConf, 2, 
Collections.singletonList(leaderId));
+      setConf.get(1, TimeUnit.SECONDS);
     } finally {
       if (clientThread != null) {
         clientRunning.set(false);
         clientThread.interrupt();
       }
-      cluster.shutdown();
     }
   }
 
@@ -407,15 +380,13 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testNoChangeRequest() throws Exception {
-    LOG.info("Start testNoChangeRequest");
     // originally 3 peers
-    final MiniRaftCluster cluster = getCluster(3);
-    try {
-      cluster.start();
-      RaftTestUtil.waitForLeader(cluster);
+    runWithNewCluster(3, this::runTestNoChangeRequest);
+  }
 
-      final RaftServerImpl leader = cluster.getLeader();
-      final RaftClient client = cluster.createClient(leader.getId());
+  void runTestNoChangeRequest(CLUSTER cluster) throws Exception {
+    final RaftServerImpl leader = RaftTestUtil.waitForLeader(cluster);
+    try(final RaftClient client = cluster.createClient(leader.getId())) {
       client.send(new SimpleMessage("m"));
 
       final RaftLog leaderLog = leader.getState().getLog();
@@ -429,8 +400,6 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
           .getLog().getLastCommittedIndex());
       Assert.assertSame(confBefore, cluster.getLeader().getRaftConf());
       client.close();
-    } finally {
-      cluster.shutdown();
     }
   }
 
@@ -440,11 +409,12 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testOverlappedSetConfRequests() throws Exception {
-    LOG.info("Start testOverlappedSetConfRequests");
     // originally 3 peers
-    final MiniRaftCluster cluster = getCluster(3);
+    runWithNewCluster(3, this::runTestOverlappedSetConfRequests);
+  }
+
+  void runTestOverlappedSetConfRequests(CLUSTER cluster) throws Exception {
     try {
-      cluster.start();
       RaftTestUtil.waitForLeader(cluster);
 
       final RaftPeerId leaderId = cluster.getLeader().getId();
@@ -491,7 +461,6 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
       Assert.assertTrue(caughtException.get());
     } finally {
       logSyncDelay.clear();
-      cluster.shutdown();
     }
   }
 
@@ -501,11 +470,12 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
    */
   @Test
   public void testRevertConfigurationChange() throws Exception {
-    LOG.info("Start testRevertConfigurationChange");
+    runWithNewCluster(5, this::runTestRevertConfigurationChange);
+  }
+
+  void runTestRevertConfigurationChange(CLUSTER cluster) throws Exception {
     RaftLog log2 = null;
-    final MiniRaftCluster cluster = getCluster(5);
     try {
-      cluster.start();
       RaftTestUtil.waitForLeader(cluster);
 
       final RaftServerImpl leader = cluster.getLeader();
@@ -572,7 +542,6 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
       log2 = null;
     } finally {
       RaftStorageTestUtils.printLog(log2, s -> LOG.info(s));
-      cluster.shutdown();
     }
   }
 
@@ -583,7 +552,7 @@ public abstract class RaftReconfigurationBaseTest extends 
BaseTest {
   @Test
   public void testLeaderNotReadyException() throws Exception {
     LOG.info("Start testLeaderNotReadyException");
-    final MiniRaftCluster cluster = getCluster(1).initServers();
+    final MiniRaftCluster cluster = newCluster(1).initServers();
     try {
       // delay 1s for each logSync call
       cluster.getServers().forEach(

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftServerTestUtil.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftServerTestUtil.java
 
b/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftServerTestUtil.java
index b18f794..ea9b9a2 100644
--- 
a/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftServerTestUtil.java
+++ 
b/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftServerTestUtil.java
@@ -22,6 +22,7 @@ import org.apache.ratis.MiniRaftCluster;
 import org.apache.ratis.protocol.ClientId;
 import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftPeer;
+import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.util.JavaUtils;
 import org.apache.ratis.util.LogUtils;
 import org.apache.ratis.util.TimeDuration;
@@ -42,14 +43,14 @@ public class RaftServerTestUtil {
   }
 
   public static void waitAndCheckNewConf(MiniRaftCluster cluster,
-      RaftPeer[] peers, int numOfRemovedPeers, Collection<String> deadPeers)
+      RaftPeer[] peers, int numOfRemovedPeers, Collection<RaftPeerId> 
deadPeers)
       throws Exception {
     final TimeDuration sleepTime = cluster.getTimeoutMax().apply(n -> n * 
(numOfRemovedPeers + 2));
     JavaUtils.attempt(() -> waitAndCheckNewConf(cluster, peers, deadPeers),
         10, sleepTime, "waitAndCheckNewConf", LOG);
   }
   private static void waitAndCheckNewConf(MiniRaftCluster cluster,
-      RaftPeer[] peers, Collection<String> deadPeers) {
+      RaftPeer[] peers, Collection<RaftPeerId> deadPeers) {
     LOG.info("waitAndCheckNewConf: peers={}, deadPeers={}, {}", 
Arrays.asList(peers), deadPeers, cluster.printServers());
     Assert.assertNotNull(cluster.getLeader());
 
@@ -59,7 +60,7 @@ public class RaftServerTestUtil {
         .setConf(peers).setLogEntryIndex(0).build();
     for (RaftServerImpl server : cluster.iterateServerImpls()) {
       LOG.info("checking {}", server);
-      if (deadPeers != null && deadPeers.contains(server.getId().toString())) {
+      if (deadPeers != null && deadPeers.contains(server.getId())) {
         if (current.containsInConf(server.getId())) {
           deadIncluded++;
         }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftReconfigurationWithGrpc.java
----------------------------------------------------------------------
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftReconfigurationWithGrpc.java
 
b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftReconfigurationWithGrpc.java
index 29f8bea..105eb11 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftReconfigurationWithGrpc.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftReconfigurationWithGrpc.java
@@ -22,15 +22,10 @@ import 
org.apache.ratis.grpc.server.GrpcServerProtocolService;
 import org.apache.ratis.server.impl.RaftReconfigurationBaseTest;
 import org.apache.ratis.util.LogUtils;
 
-import java.io.IOException;
-
-public class TestRaftReconfigurationWithGrpc extends 
RaftReconfigurationBaseTest {
+public class TestRaftReconfigurationWithGrpc
+    extends RaftReconfigurationBaseTest<MiniRaftClusterWithGrpc>
+    implements MiniRaftClusterWithGrpc.FactoryGet {
   static {
     LogUtils.setLogLevel(GrpcServerProtocolService.LOG, Level.DEBUG);
   }
-
-  @Override
-  public MiniRaftClusterWithGrpc getCluster(int peerNum) {
-    return MiniRaftClusterWithGrpc.FACTORY.newCluster(peerNum, prop);
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/ratis-test/src/test/java/org/apache/ratis/netty/TestRaftReconfigurationWithNetty.java
----------------------------------------------------------------------
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/netty/TestRaftReconfigurationWithNetty.java
 
b/ratis-test/src/test/java/org/apache/ratis/netty/TestRaftReconfigurationWithNetty.java
index 15fa8e6..2997bb9 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/netty/TestRaftReconfigurationWithNetty.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/netty/TestRaftReconfigurationWithNetty.java
@@ -17,15 +17,9 @@
  */
 package org.apache.ratis.netty;
 
-import java.io.IOException;
-
-import org.apache.ratis.MiniRaftCluster;
 import org.apache.ratis.server.impl.RaftReconfigurationBaseTest;
 
 public class TestRaftReconfigurationWithNetty
-    extends RaftReconfigurationBaseTest {
-  @Override
-  public MiniRaftCluster getCluster(int peerNum) throws IOException {
-    return MiniRaftClusterWithNetty.FACTORY.newCluster(peerNum, prop);
-  }
+    extends RaftReconfigurationBaseTest<MiniRaftClusterWithNetty>
+    implements MiniRaftClusterWithNetty.FactoryGet {
 }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/68bb4c91/ratis-test/src/test/java/org/apache/ratis/server/simulation/TestRaftReconfigurationWithSimulatedRpc.java
----------------------------------------------------------------------
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/server/simulation/TestRaftReconfigurationWithSimulatedRpc.java
 
b/ratis-test/src/test/java/org/apache/ratis/server/simulation/TestRaftReconfigurationWithSimulatedRpc.java
index b1bb26a..d31dcc5 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/server/simulation/TestRaftReconfigurationWithSimulatedRpc.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/server/simulation/TestRaftReconfigurationWithSimulatedRpc.java
@@ -17,15 +17,9 @@
  */
 package org.apache.ratis.server.simulation;
 
-import java.io.IOException;
-
-import org.apache.ratis.MiniRaftCluster;
 import org.apache.ratis.server.impl.RaftReconfigurationBaseTest;
 
 public class TestRaftReconfigurationWithSimulatedRpc
-    extends RaftReconfigurationBaseTest {
-  @Override
-  public MiniRaftCluster getCluster(int peerNum) throws IOException {
-    return MiniRaftClusterWithSimulatedRpc.FACTORY.newCluster(peerNum, prop);
-  }
+    extends RaftReconfigurationBaseTest<MiniRaftClusterWithSimulatedRpc>
+    implements MiniRaftClusterWithSimulatedRpc.FactoryGet {
 }

Reply via email to