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 {