You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by ru...@apache.org on 2020/12/23 06:06:50 UTC

[incubator-ratis] branch master updated: RATIS-1259. Move RaftServer and the related interfaces to raft-server-api. (#371)

This is an automated email from the ASF dual-hosted git repository.

runzhiwang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new 4627942  RATIS-1259. Move RaftServer and the related interfaces to raft-server-api. (#371)
4627942 is described below

commit 46279423107a66c1f22f36fb374a66081d44cb27
Author: Tsz-Wo Nicholas Sze <sz...@apache.org>
AuthorDate: Wed Dec 23 14:06:43 2020 +0800

    RATIS-1259. Move RaftServer and the related interfaces to raft-server-api. (#371)
---
 .../org/apache/ratis/server/DataStreamMap.java     |  0
 .../ratis/server/DataStreamServerFactory.java      |  0
 .../java/org/apache/ratis/server/RaftServer.java   | 34 ++++++++++++++++++++--
 .../org/apache/ratis/server/ServerFactory.java     |  0
 .../apache/ratis/server/leader/LeaderState.java    |  0
 .../apache/ratis/server/leader/LogAppender.java    |  7 ++++-
 .../apache/ratis/statemachine/StateMachine.java    |  4 +--
 .../apache/ratis/server/impl/ServerImplUtils.java  |  5 ++--
 .../ratis/statemachine/impl/BaseStateMachine.java  |  6 ----
 .../apache/ratis/server/impl/MiniRaftCluster.java  |  4 ---
 .../apache/ratis/grpc/TestRaftServerWithGrpc.java  | 19 ++++++++++--
 11 files changed, 59 insertions(+), 20 deletions(-)

diff --git a/ratis-server/src/main/java/org/apache/ratis/server/DataStreamMap.java b/ratis-server-api/src/main/java/org/apache/ratis/server/DataStreamMap.java
similarity index 100%
rename from ratis-server/src/main/java/org/apache/ratis/server/DataStreamMap.java
rename to ratis-server-api/src/main/java/org/apache/ratis/server/DataStreamMap.java
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/DataStreamServerFactory.java b/ratis-server-api/src/main/java/org/apache/ratis/server/DataStreamServerFactory.java
similarity index 100%
rename from ratis-server/src/main/java/org/apache/ratis/server/DataStreamServerFactory.java
rename to ratis-server-api/src/main/java/org/apache/ratis/server/DataStreamServerFactory.java
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/RaftServer.java b/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServer.java
similarity index 82%
rename from ratis-server/src/main/java/org/apache/ratis/server/RaftServer.java
rename to ratis-server-api/src/main/java/org/apache/ratis/server/RaftServer.java
index 95bd846..b8ee749 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/RaftServer.java
+++ b/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServer.java
@@ -22,19 +22,22 @@ import org.apache.ratis.conf.Parameters;
 import org.apache.ratis.conf.RaftProperties;
 import org.apache.ratis.protocol.*;
 import org.apache.ratis.rpc.RpcType;
-import org.apache.ratis.server.impl.ServerImplUtils;
 import org.apache.ratis.server.metrics.RaftServerMetrics;
 import org.apache.ratis.server.protocol.RaftServerAsynchronousProtocol;
 import org.apache.ratis.server.protocol.RaftServerProtocol;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.server.storage.RaftStorage;
 import org.apache.ratis.statemachine.StateMachine;
+import org.apache.ratis.util.IOUtils;
 import org.apache.ratis.util.LifeCycle;
+import org.apache.ratis.util.ReflectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -149,6 +152,33 @@ public interface RaftServer extends Closeable, RpcType.Get,
 
   /** To build {@link RaftServer} objects. */
   class Builder {
+    private static final Method NEW_RAFT_SERVER_METHOD = initNewRaftServerMethod();
+
+    private static Method initNewRaftServerMethod() {
+      final String className = RaftServer.class.getPackage().getName() + ".impl.ServerImplUtils";
+      final Class<?>[] argClasses = {RaftPeerId.class, RaftGroup.class, StateMachine.Registry.class,
+          RaftProperties.class, Parameters.class};
+      try {
+        final Class<?> clazz = ReflectionUtils.getClassByName(className);
+        return clazz.getMethod("newRaftServer", argClasses);
+      } catch (Exception e) {
+        throw new IllegalStateException("Failed to initNewRaftServerMethod", e);
+      }
+    }
+
+    private static RaftServer newRaftServer(RaftPeerId serverId, RaftGroup group,
+        StateMachine.Registry stateMachineRegistry, RaftProperties properties, Parameters parameters)
+        throws IOException {
+      try {
+        return (RaftServer) NEW_RAFT_SERVER_METHOD.invoke(null,
+            serverId, group, stateMachineRegistry, properties, parameters);
+      } catch (IllegalAccessException e) {
+        throw new IllegalStateException("Failed to build " + serverId, e);
+      } catch (InvocationTargetException e) {
+        throw IOUtils.asIOException(e.getCause());
+      }
+    }
+
     private RaftPeerId serverId;
     private StateMachine.Registry stateMachineRegistry ;
     private RaftGroup group = null;
@@ -157,7 +187,7 @@ public interface RaftServer extends Closeable, RpcType.Get,
 
     /** @return a {@link RaftServer} object. */
     public RaftServer build() throws IOException {
-      return ServerImplUtils.newRaftServer(
+      return newRaftServer(
           serverId,
           group,
           Objects.requireNonNull(stateMachineRegistry , "Neither 'stateMachine' nor 'setStateMachineRegistry' " +
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/ServerFactory.java b/ratis-server-api/src/main/java/org/apache/ratis/server/ServerFactory.java
similarity index 100%
rename from ratis-server/src/main/java/org/apache/ratis/server/ServerFactory.java
rename to ratis-server-api/src/main/java/org/apache/ratis/server/ServerFactory.java
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/leader/LeaderState.java b/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LeaderState.java
similarity index 100%
rename from ratis-server/src/main/java/org/apache/ratis/server/leader/LeaderState.java
rename to ratis-server-api/src/main/java/org/apache/ratis/server/leader/LeaderState.java
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppender.java b/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
similarity index 93%
rename from ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppender.java
rename to ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
index 483ef33..382f48a 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppender.java
+++ b/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
@@ -26,6 +26,7 @@ import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.server.raftlog.RaftLogIOException;
 import org.apache.ratis.statemachine.SnapshotInfo;
+import org.apache.ratis.util.ReflectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,9 +38,13 @@ import java.io.IOException;
 public interface LogAppender {
   Logger LOG = LoggerFactory.getLogger(LogAppender.class);
 
+  Class<? extends LogAppender> DEFAULT_CLASS = ReflectionUtils.getClass(
+      LogAppender.class.getName() + "Default", LogAppender.class);
+
   /** Create the default {@link LogAppender}. */
   static LogAppender newLogAppenderDefault(RaftServer.Division server, LeaderState leaderState, FollowerInfo f) {
-    return new LogAppenderDefault(server, leaderState, f);
+    final Class<?>[] argClasses = {RaftServer.Division.class, LeaderState.class, FollowerInfo.class};
+    return ReflectionUtils.newInstance(DEFAULT_CLASS, argClasses, server, leaderState, f);
   }
 
   /** @return the server. */
diff --git a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
index 7d1250e..112c0a5 100644
--- a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
+++ b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
@@ -27,6 +27,7 @@ import org.apache.ratis.protocol.RaftClientRequest;
 import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.protocol.RaftPeerId;
+import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.storage.RaftStorage;
 import org.apache.ratis.thirdparty.com.google.protobuf.ByteString;
@@ -331,8 +332,7 @@ public interface StateMachine extends Closeable {
    * Initializes the State Machine with the given parameter.
    * The state machine must, if there is any, read the latest snapshot.
    */
-  //TODO change the raftServer parameter back to RaftServer once RaftServer has been moved to ratis-server-api
-  void initialize(Object raftServer, RaftGroupId raftGroupId, RaftStorage storage) throws IOException;
+  void initialize(RaftServer raftServer, RaftGroupId raftGroupId, RaftStorage storage) throws IOException;
 
   /**
    * Returns the lifecycle state for this StateMachine.
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java
index 60c516c..9bc9918 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerImplUtils.java
@@ -41,7 +41,8 @@ public final class ServerImplUtils {
   private ServerImplUtils() {
     //Never constructed
   }
-  /** For the case that all {@link RaftServerImpl} objects share the same {@link StateMachine}. */
+
+  /** Create a {@link RaftServerProxy}. */
   public static RaftServerProxy newRaftServer(
       RaftPeerId id, RaftGroup group, StateMachine.Registry stateMachineRegistry,
       RaftProperties properties, Parameters parameters) throws IOException {
@@ -51,7 +52,7 @@ public final class ServerImplUtils {
     return proxy;
   }
 
-  public static RaftServerProxy newRaftServer(
+  private static RaftServerProxy newRaftServer(
       RaftPeerId id, StateMachine.Registry stateMachineRegistry, RaftProperties properties, Parameters parameters)
       throws IOException {
     final TimeDuration sleepTime = TimeDuration.valueOf(500, TimeUnit.MILLISECONDS);
diff --git a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
index c086e54..8caf6e1 100644
--- a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
+++ b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
@@ -83,12 +83,6 @@ public class BaseStateMachine implements StateMachine, StateMachine.DataApi,
   }
 
   @Override
-  public void initialize(Object raftServer, RaftGroupId raftGroupId, RaftStorage storage) throws IOException {
-    Preconditions.assertTrue(raftServer instanceof RaftServer,
-        () -> "Unexpected parameter " + raftServer.getClass());
-    initialize((RaftServer) raftServer, raftGroupId, storage);
-  }
-
   public void initialize(RaftServer raftServer, RaftGroupId raftGroupId, RaftStorage storage) throws IOException {
     this.groupId = raftGroupId;
     this.server.complete(raftServer);
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/impl/MiniRaftCluster.java b/ratis-server/src/test/java/org/apache/ratis/server/impl/MiniRaftCluster.java
index bd638a2..cba7758 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/impl/MiniRaftCluster.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/impl/MiniRaftCluster.java
@@ -354,10 +354,6 @@ public abstract class MiniRaftCluster implements Closeable {
     }
   }
 
-  public RaftServer newRaftServer(RaftPeerId id, StateMachine stateMachine, RaftProperties p) throws IOException {
-    return ServerImplUtils.newRaftServer(id, getGroup(), gid -> stateMachine, p, null);
-  }
-
   protected abstract Parameters setPropertiesAndInitParameters(
       RaftPeerId id, RaftGroup group, RaftProperties properties);
 
diff --git a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java
index 836d096..b170309 100644
--- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java
+++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java
@@ -30,6 +30,7 @@ import com.codahale.metrics.Gauge;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.log4j.Level;
 import org.apache.ratis.BaseTest;
+import org.apache.ratis.protocol.RaftGroup;
 import org.apache.ratis.server.impl.MiniRaftCluster;
 import org.apache.ratis.RaftTestUtil;
 import org.apache.ratis.RaftTestUtil.SimpleMessage;
@@ -92,6 +93,18 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
     runWithNewCluster(1, this::runTestServerRestartOnException);
   }
 
+  static RaftServer newRaftServer(MiniRaftClusterWithGrpc cluster, RaftPeerId id, StateMachine stateMachine,
+      RaftProperties p) throws IOException {
+    final RaftGroup group = cluster.getGroup();
+    return RaftServer.newBuilder()
+        .setServerId(id)
+        .setGroup(cluster.getGroup())
+        .setStateMachine(stateMachine)
+        .setProperties(p)
+        .setParameters(cluster.setPropertiesAndInitParameters(id, group, p))
+        .build();
+  }
+
   void runTestServerRestartOnException(MiniRaftClusterWithGrpc cluster) throws Exception {
     final RaftServer.Division leader = RaftTestUtil.waitForLeader(cluster);
     final RaftPeerId leaderId = leader.getId();
@@ -104,7 +117,7 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
     // be used by next raft server proxy instance.
     final StateMachine stateMachine = cluster.getLeader().getStateMachine();
     RaftServerConfigKeys.setStorageDir(p, Collections.singletonList(cluster.getStorageDir(leaderId)));
-    cluster.newRaftServer(leaderId, stateMachine, p);
+    newRaftServer(cluster, leaderId, stateMachine, p);
     // Close the server rpc for leader so that new raft server can be bound to it.
     RaftServerTestUtil.getServerRpc(cluster.getLeader()).close();
 
@@ -114,7 +127,7 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
     // the rpc server on failure.
     RaftServerConfigKeys.setStorageDir(p, Collections.singletonList(cluster.getStorageDir(leaderId)));
     testFailureCase("start a new server with the same address",
-        () -> cluster.newRaftServer(leaderId, stateMachine, p).start(),
+        () -> newRaftServer(cluster, leaderId, stateMachine, p).start(),
         IOException.class, OverlappingFileLockException.class);
     // Try to start a raft server rpc at the leader address.
     cluster.getServerFactory(leaderId).newRaftServerRpc(cluster.getServer(leaderId));
@@ -140,7 +153,7 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
 
   @Test
   public void testLeaderRestart() throws Exception {
-    runWithNewCluster(1, this::runTestLeaderRestart);
+    runWithNewCluster(3, this::runTestLeaderRestart);
   }
 
   void runTestLeaderRestart(MiniRaftClusterWithGrpc cluster) throws Exception {