Server code cleanup: remove rarely used methods and reduce method visibility.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ratis/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ratis/commit/eaadf8e6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ratis/tree/eaadf8e6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ratis/diff/eaadf8e6 Branch: refs/heads/master Commit: eaadf8e66a98e2bc5e254af96a56f6d8f6d9800f Parents: a38e2f7 Author: Tsz-Wo Nicholas Sze <szets...@hortonworks.com> Authored: Tue Jan 3 19:42:48 2017 +0800 Committer: Tsz-Wo Nicholas Sze <szets...@hortonworks.com> Committed: Tue Jan 3 19:42:48 2017 +0800 ---------------------------------------------------------------------- .../apache/raft/server/impl/FollowerState.java | 4 +- .../apache/raft/server/impl/LeaderElection.java | 4 +- .../apache/raft/server/impl/LeaderState.java | 7 +-- .../raft/server/impl/RaftConfiguration.java | 12 ++--- .../apache/raft/server/impl/RaftServerImpl.java | 17 +++--- .../java/org/apache/raft/server/impl/Role.java | 25 --------- .../raft/server/impl/RaftServerTestUtil.java | 6 +++ .../raft/statemachine/RaftSnapshotBaseTest.java | 57 ++++++++++---------- .../SimpleStateMachine4Testing.java | 10 ++-- .../raft/statemachine/TestStateMachine.java | 11 ++-- 10 files changed, 71 insertions(+), 82 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/main/java/org/apache/raft/server/impl/FollowerState.java ---------------------------------------------------------------------- diff --git a/raft-server/src/main/java/org/apache/raft/server/impl/FollowerState.java b/raft-server/src/main/java/org/apache/raft/server/impl/FollowerState.java index 20f2d8f..fbef188 100644 --- a/raft-server/src/main/java/org/apache/raft/server/impl/FollowerState.java +++ b/raft-server/src/main/java/org/apache/raft/server/impl/FollowerState.java @@ -67,8 +67,8 @@ class FollowerState extends Daemon { } synchronized (server) { if (!inLogSync && lastRpcTime.elapsedTimeMs() >= electionTimeout) { - LOG.info("{} changes to {}, lastRpcTime:{}, electionTimeout:{}", - server.getId(), Role.CANDIDATE, lastRpcTime, electionTimeout); + LOG.info("{} changes to CANDIDATE, lastRpcTime:{}, electionTimeout:{}ms", + server.getId(), lastRpcTime, electionTimeout); // election timeout, should become a candidate server.changeToCandidate(); break; http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/main/java/org/apache/raft/server/impl/LeaderElection.java ---------------------------------------------------------------------- diff --git a/raft-server/src/main/java/org/apache/raft/server/impl/LeaderElection.java b/raft-server/src/main/java/org/apache/raft/server/impl/LeaderElection.java index 39bdb13..a326eb5 100644 --- a/raft-server/src/main/java/org/apache/raft/server/impl/LeaderElection.java +++ b/raft-server/src/main/java/org/apache/raft/server/impl/LeaderElection.java @@ -104,8 +104,8 @@ class LeaderElection extends Daemon { } catch (InterruptedException e) { // the leader election thread is interrupted. The peer may already step // down to a follower. The leader election should skip. - LOG.info("The leader election thread of peer {} is interrupted. " + - "Currently role: {}.", server.getId(), server.getRole()); + LOG.info(server.getId() + " " + getClass().getSimpleName() + + " thread is interrupted gracefully; server=" + server); } catch (IOException e) { LOG.warn("Failed to persist votedFor/term. Exit the leader election.", e); stopRunning(); http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/main/java/org/apache/raft/server/impl/LeaderState.java ---------------------------------------------------------------------- diff --git a/raft-server/src/main/java/org/apache/raft/server/impl/LeaderState.java b/raft-server/src/main/java/org/apache/raft/server/impl/LeaderState.java index 39dc400..fbbcb85 100644 --- a/raft-server/src/main/java/org/apache/raft/server/impl/LeaderState.java +++ b/raft-server/src/main/java/org/apache/raft/server/impl/LeaderState.java @@ -308,11 +308,12 @@ public class LeaderState { } // the updated configuration does not need to be sync'ed here } catch (InterruptedException e) { + final String s = server.getId() + " " + getClass().getSimpleName() + + " thread is interrupted "; if (!running) { - LOG.info("The LeaderState gets is stopped"); + LOG.info(s + " gracefully; server=" + server); } else { - LOG.warn("The leader election thread of peer {} is interrupted. " - + "Currently role: {}.", server.getId(), server.getRole()); + LOG.warn(s + " UNEXPECTEDLY; server=" + server, e); throw new RuntimeException(e); } } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/main/java/org/apache/raft/server/impl/RaftConfiguration.java ---------------------------------------------------------------------- diff --git a/raft-server/src/main/java/org/apache/raft/server/impl/RaftConfiguration.java b/raft-server/src/main/java/org/apache/raft/server/impl/RaftConfiguration.java index 28ff330..4879314 100644 --- a/raft-server/src/main/java/org/apache/raft/server/impl/RaftConfiguration.java +++ b/raft-server/src/main/java/org/apache/raft/server/impl/RaftConfiguration.java @@ -140,12 +140,12 @@ public class RaftConfiguration { } /** Is this configuration transitional, i.e. in the middle of a peer change? */ - public boolean isTransitional() { + boolean isTransitional() { return oldConf != null; } /** Is this configuration stable, i.e. no on-going peer change? */ - public boolean isStable() { + boolean isStable() { return oldConf == null; } @@ -157,7 +157,7 @@ public class RaftConfiguration { return oldConf != null && oldConf.contains(peerId); } - public boolean contains(String peerId) { + boolean contains(String peerId) { return containsInConf(peerId) && (oldConf == null || containsInOldConf(peerId)); } @@ -203,7 +203,7 @@ public class RaftConfiguration { } /** @return true if the self id together with the others are in the majority. */ - public boolean hasMajority(Collection<String> others, String selfId) { + boolean hasMajority(Collection<String> others, String selfId) { Preconditions.checkArgument(!others.contains(selfId)); return conf.hasMajority(others, selfId) && (oldConf == null || oldConf.hasMajority(others, selfId)); @@ -251,11 +251,11 @@ public class RaftConfiguration { return peers.get(index); } - public Collection<RaftPeer> getPeersInOldConf() { + Collection<RaftPeer> getPeersInOldConf() { return oldConf != null ? oldConf.getPeers() : Collections.emptyList(); } - public Collection<RaftPeer> getPeersInConf() { + Collection<RaftPeer> getPeersInConf() { return conf.getPeers(); } } http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/main/java/org/apache/raft/server/impl/RaftServerImpl.java ---------------------------------------------------------------------- diff --git a/raft-server/src/main/java/org/apache/raft/server/impl/RaftServerImpl.java b/raft-server/src/main/java/org/apache/raft/server/impl/RaftServerImpl.java index 1ea40f6..c8a2e28 100644 --- a/raft-server/src/main/java/org/apache/raft/server/impl/RaftServerImpl.java +++ b/raft-server/src/main/java/org/apache/raft/server/impl/RaftServerImpl.java @@ -58,6 +58,11 @@ public class RaftServerImpl implements RaftServer { static final String INSTALL_SNAPSHOT = CLASS_NAME + ".installSnapshot"; + /** Role of raft peer */ + enum Role { + LEADER, CANDIDATE, FOLLOWER + } + private final int minTimeoutMs; private final int maxTimeoutMs; @@ -97,19 +102,19 @@ public class RaftServerImpl implements RaftServer { appenderFactory = initAppenderFactory(); } - public int getMinTimeoutMs() { + int getMinTimeoutMs() { return minTimeoutMs; } - public int getMaxTimeoutMs() { + int getMaxTimeoutMs() { return maxTimeoutMs; } - public int getRandomTimeoutMs() { + int getRandomTimeoutMs() { return RaftUtils.getRandomBetween(minTimeoutMs, maxTimeoutMs); } - public StateMachine getStateMachine() { + StateMachine getStateMachine() { return this.stateMachine; } @@ -230,10 +235,6 @@ public class RaftServerImpl implements RaftServer { return role == Role.LEADER; } - Role getRole() { - return role; - } - /** * Change the server state to Follower if necessary * @param newTerm The new term. http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/main/java/org/apache/raft/server/impl/Role.java ---------------------------------------------------------------------- diff --git a/raft-server/src/main/java/org/apache/raft/server/impl/Role.java b/raft-server/src/main/java/org/apache/raft/server/impl/Role.java deleted file mode 100644 index 1413961..0000000 --- a/raft-server/src/main/java/org/apache/raft/server/impl/Role.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.raft.server.impl; - -/** - * Role of Raft peer - */ -public enum Role { - LEADER, CANDIDATE, FOLLOWER -} http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/test/java/org/apache/raft/server/impl/RaftServerTestUtil.java ---------------------------------------------------------------------- diff --git a/raft-server/src/test/java/org/apache/raft/server/impl/RaftServerTestUtil.java b/raft-server/src/test/java/org/apache/raft/server/impl/RaftServerTestUtil.java index 5103fca..bd1934f 100644 --- a/raft-server/src/test/java/org/apache/raft/server/impl/RaftServerTestUtil.java +++ b/raft-server/src/test/java/org/apache/raft/server/impl/RaftServerTestUtil.java @@ -20,6 +20,8 @@ package org.apache.raft.server.impl; import org.apache.raft.MiniRaftCluster; import org.apache.raft.RaftTestUtil; import org.apache.raft.protocol.RaftPeer; +import org.apache.raft.server.RaftServer; +import org.apache.raft.statemachine.StateMachine; import org.junit.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,4 +66,8 @@ public class RaftServerTestUtil { } Assert.assertEquals(peers.length, numIncluded + deadIncluded); } + + public static StateMachine getStateMachine(RaftServerImpl s) { + return s.getStateMachine(); + } } http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/test/java/org/apache/raft/statemachine/RaftSnapshotBaseTest.java ---------------------------------------------------------------------- diff --git a/raft-server/src/test/java/org/apache/raft/statemachine/RaftSnapshotBaseTest.java b/raft-server/src/test/java/org/apache/raft/statemachine/RaftSnapshotBaseTest.java index 721d12c..fbdcb8b 100644 --- a/raft-server/src/test/java/org/apache/raft/statemachine/RaftSnapshotBaseTest.java +++ b/raft-server/src/test/java/org/apache/raft/statemachine/RaftSnapshotBaseTest.java @@ -25,6 +25,7 @@ import org.apache.raft.client.RaftClient; import org.apache.raft.conf.RaftProperties; import org.apache.raft.protocol.RaftClientReply; import org.apache.raft.protocol.SetConfigurationRequest; +import org.apache.raft.server.RaftServer; import org.apache.raft.server.impl.RaftServerImpl; import org.apache.raft.server.impl.RaftServerTestUtil; import org.apache.raft.server.simulation.RequestHandler; @@ -61,6 +62,28 @@ public abstract class RaftSnapshotBaseTest { static final Logger LOG = LoggerFactory.getLogger(RaftSnapshotBaseTest.class); private static final int SNAPSHOT_TRIGGER_THRESHOLD = 10; + static File getSnapshotFile(MiniRaftCluster cluster, int i) { + final RaftServerImpl leader = cluster.getLeader(); + final SimpleStateMachine4Testing sm = SimpleStateMachine4Testing.get(leader); + return sm.getStateMachineStorage().getSnapshotFile( + leader.getState().getCurrentTerm(), i); + } + + static void assertLeaderContent(MiniRaftCluster cluster) + throws InterruptedException { + final RaftServerImpl leader = RaftTestUtil.waitForLeader(cluster); + Assert.assertEquals(SNAPSHOT_TRIGGER_THRESHOLD * 2, + leader.getState().getLog().getLastCommittedIndex()); + final LogEntryProto[] entries = SimpleStateMachine4Testing.get(leader).getContent(); + + for (int i = 1; i < SNAPSHOT_TRIGGER_THRESHOLD * 2 - 1; i++) { + Assert.assertEquals(i+1, entries[i].getIndex()); + Assert.assertArrayEquals( + new SimpleMessage("m" + i).getContent().toByteArray(), + entries[i].getSmLogEntry().getData().toByteArray()); + } + } + private MiniRaftCluster cluster; public abstract MiniRaftCluster initCluster(int numServer, RaftProperties prop) @@ -103,9 +126,7 @@ public abstract class RaftSnapshotBaseTest { } // wait for the snapshot to be done - StateMachine sm = cluster.getLeader().getStateMachine(); - File snapshotFile = ((SimpleStateMachineStorage)sm.getStateMachineStorage()) - .getSnapshotFile(cluster.getLeader().getState().getCurrentTerm(), i); + final File snapshotFile = getSnapshotFile(cluster, i); int retries = 0; do { @@ -117,19 +138,8 @@ public abstract class RaftSnapshotBaseTest { // restart the peer and check if it can correctly load snapshot cluster.restart(false); try { - RaftTestUtil.waitForLeader(cluster); - // 200 messages + two leader elections --> last committed = 201 - Assert.assertEquals(SNAPSHOT_TRIGGER_THRESHOLD * 2, - cluster.getLeader().getState().getLog().getLastCommittedIndex()); - sm = cluster.getLeader().getStateMachine(); - LogEntryProto[] entries = ((SimpleStateMachine4Testing) sm).getContent(); - for (i = 1; i < SNAPSHOT_TRIGGER_THRESHOLD * 2 - 1; i++) { - Assert.assertEquals(i+1, entries[i].getIndex()); - Assert.assertArrayEquals( - new SimpleMessage("m" + i).getContent().toByteArray(), - entries[i].getSmLogEntry().getData().toByteArray()); - } + assertLeaderContent(cluster); } finally { cluster.shutdown(); } @@ -158,9 +168,7 @@ public abstract class RaftSnapshotBaseTest { // wait for the snapshot to be done RaftStorageDirectory storageDirectory = cluster.getLeader().getState() .getStorage().getStorageDir(); - StateMachine sm = cluster.getLeader().getStateMachine(); - File snapshotFile = ((SimpleStateMachineStorage) sm.getStateMachineStorage()) - .getSnapshotFile(cluster.getLeader().getState().getCurrentTerm(), i); + final File snapshotFile = getSnapshotFile(cluster, i); logs = storageDirectory.getLogSegmentFiles(); int retries = 0; @@ -182,18 +190,7 @@ public abstract class RaftSnapshotBaseTest { LOG.info("Restarting the cluster"); cluster.restart(false); try { - RaftTestUtil.waitForLeader(cluster); - - Assert.assertEquals(SNAPSHOT_TRIGGER_THRESHOLD * 2, - cluster.getLeader().getState().getLog().getLastCommittedIndex()); - StateMachine sm = cluster.getLeader().getStateMachine(); - LogEntryProto[] entries = ((SimpleStateMachine4Testing) sm).getContent(); - for (int i = 1; i < SNAPSHOT_TRIGGER_THRESHOLD * 2 - 1; i++) { - Assert.assertEquals(i+1, entries[i].getIndex()); - Assert.assertArrayEquals( - new SimpleMessage("m" + i).getContent().toByteArray(), - entries[i].getSmLogEntry().getData().toByteArray()); - } + assertLeaderContent(cluster); // generate some more traffic try(final RaftClient client = cluster.createClient("client", http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/test/java/org/apache/raft/statemachine/SimpleStateMachine4Testing.java ---------------------------------------------------------------------- diff --git a/raft-server/src/test/java/org/apache/raft/statemachine/SimpleStateMachine4Testing.java b/raft-server/src/test/java/org/apache/raft/statemachine/SimpleStateMachine4Testing.java index 227ea58..3e0ae15 100644 --- a/raft-server/src/test/java/org/apache/raft/statemachine/SimpleStateMachine4Testing.java +++ b/raft-server/src/test/java/org/apache/raft/statemachine/SimpleStateMachine4Testing.java @@ -17,7 +17,6 @@ */ package org.apache.raft.statemachine; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import org.apache.raft.RaftTestUtil.SimpleMessage; import org.apache.raft.conf.RaftProperties; @@ -26,6 +25,8 @@ import org.apache.raft.protocol.Message; import org.apache.raft.protocol.RaftClientReply; import org.apache.raft.protocol.RaftClientRequest; import org.apache.raft.server.impl.RaftServerConstants; +import org.apache.raft.server.impl.RaftServerImpl; +import org.apache.raft.server.impl.RaftServerTestUtil; import org.apache.raft.server.protocol.TermIndex; import org.apache.raft.server.storage.LogInputStream; import org.apache.raft.server.storage.LogOutputStream; @@ -60,6 +61,10 @@ public class SimpleStateMachine4Testing extends BaseStateMachine { = "raft.test.simple.state.machine.take.snapshot"; public static final boolean RAFT_TEST_SIMPLE_STATE_MACHINE_TAKE_SNAPSHOT_DEFAULT = false; + public static SimpleStateMachine4Testing get(RaftServerImpl s) { + return (SimpleStateMachine4Testing)RaftServerTestUtil.getStateMachine(s); + } + private final List<LogEntryProto> list = Collections.synchronizedList(new ArrayList<>()); private final Daemon checkpointer; @@ -174,7 +179,7 @@ public class SimpleStateMachine4Testing extends BaseStateMachine { } @Override - public StateMachineStorage getStateMachineStorage() { + public SimpleStateMachineStorage getStateMachineStorage() { return storage; } @@ -235,7 +240,6 @@ public class SimpleStateMachine4Testing extends BaseStateMachine { }); } - @VisibleForTesting public LogEntryProto[] getContent() { return list.toArray(new LogEntryProto[list.size()]); } http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/eaadf8e6/raft-server/src/test/java/org/apache/raft/statemachine/TestStateMachine.java ---------------------------------------------------------------------- diff --git a/raft-server/src/test/java/org/apache/raft/statemachine/TestStateMachine.java b/raft-server/src/test/java/org/apache/raft/statemachine/TestStateMachine.java index 5892c65..546bfb8 100644 --- a/raft-server/src/test/java/org/apache/raft/statemachine/TestStateMachine.java +++ b/raft-server/src/test/java/org/apache/raft/statemachine/TestStateMachine.java @@ -26,6 +26,7 @@ import org.apache.raft.protocol.Message; import org.apache.raft.protocol.RaftClientRequest; import org.apache.raft.server.RaftServerConfigKeys; import org.apache.raft.server.impl.RaftServerImpl; +import org.apache.raft.server.impl.RaftServerTestUtil; import org.apache.raft.server.simulation.MiniRaftClusterWithSimulatedRpc; import org.apache.raft.shaded.proto.RaftProtos.SMLogEntryProto; import org.apache.raft.util.RaftUtils; @@ -93,7 +94,11 @@ public class TestStateMachine { return properties; } - public static class SMTransactionContext extends SimpleStateMachine4Testing { + static class SMTransactionContext extends SimpleStateMachine4Testing { + public static SMTransactionContext get(RaftServerImpl s) { + return (SMTransactionContext)RaftServerTestUtil.getStateMachine(s); + } + AtomicReference<Throwable> throwable = new AtomicReference<>(null); AtomicLong transactions = new AtomicLong(0); AtomicBoolean isLeader = new AtomicBoolean(false); @@ -162,7 +167,7 @@ public class TestStateMachine { Thread.sleep(cluster.getMaxTimeout() + 100); for (RaftServerImpl raftServer : cluster.getServers()) { - SMTransactionContext sm = ((SMTransactionContext)raftServer.getStateMachine()); + final SMTransactionContext sm = SMTransactionContext.get(raftServer); sm.rethrowIfException(); assertEquals(numTrx, sm.numApplied.get()); } @@ -170,7 +175,7 @@ public class TestStateMachine { // check leader RaftServerImpl raftServer = cluster.getLeader(); // assert every transaction has obtained context in leader - SMTransactionContext sm = ((SMTransactionContext)raftServer.getStateMachine()); + final SMTransactionContext sm = SMTransactionContext.get(raftServer); List<Long> ll = sm.applied.stream().collect(Collectors.toList()); Collections.sort(ll); assertEquals(ll.toString(), ll.size(), numTrx);