final SimpleMessage[] messages = SimpleMessage.create(numMessages); final RaftClient client = cluster.createClient();
static void runTestTransactionContextIsPassedBack(MiniRaftCluster cluster) throws Throwable { // tests that the TrxContext set by the StateMachine in Leader is passed back to the SM int numTrx = 100; final RaftTestUtil.SimpleMessage[] messages = RaftTestUtil.SimpleMessage.create(numTrx); try(final RaftClient client = cluster.createClient()) { for (RaftTestUtil.SimpleMessage message : messages) { client.send(message); } } // TODO: there eshould be a better way to ensure all data is replicated and applied Thread.sleep(cluster.getMaxTimeout() + 100); for (RaftServerImpl raftServer : cluster.iterateServerImpls()) { final SMTransactionContext sm = SMTransactionContext.get(raftServer); sm.rethrowIfException(); assertEquals(numTrx, sm.numApplied.get()); } // check leader RaftServerImpl raftServer = cluster.getLeader(); // assert every transaction has obtained context in leader final SMTransactionContext sm = SMTransactionContext.get(raftServer); List<Long> ll = sm.applied.stream().collect(Collectors.toList()); Collections.sort(ll); assertEquals(ll.toString(), ll.size(), numTrx); for (int i=0; i < numTrx; i++) { assertEquals(ll.toString(), Long.valueOf(i+1), ll.get(i)); } }
final RaftTestUtil.SimpleMessage[] messages = RaftTestUtil.SimpleMessage.create(numTrx); try(final RaftClient client = cluster.createClient()) { for (RaftTestUtil.SimpleMessage message : messages) {
final SimpleMessage[] messages = SimpleMessage.create(numMessages);
void runTestRestartCommitIndex(MiniRaftCluster cluster) throws Exception { final TimeDuration sleepTime = TimeDuration.valueOf(100, TimeUnit.MILLISECONDS); final SimpleMessage[] messages = SimpleMessage.create(10); try (final RaftClient client = cluster.createClient()) { for(SimpleMessage m : messages) {
final SimpleMessage[] messages = SimpleMessage.create(numMessages);
final RaftTestUtil.SimpleMessage[] messages = RaftTestUtil.SimpleMessage.create(numMessages); final RaftClient client = cluster.createClient();
SimpleMessage[] messages = SimpleMessage.create(1); RaftTestUtil.sendMessageInNewThread(cluster, messages);
LOG.info("leader: " + leader.getId() + ", " + cluster.printServers()); final SimpleMessage message = SimpleMessage.create(1)[0]; try (final RaftClient client = cluster.createClientWithLeader()) { final RaftClientReply reply;
void runTestOldLeaderCommit(CLUSTER cluster) throws Exception { final RaftServerImpl leader = waitForLeader(cluster); final RaftPeerId leaderId = leader.getId(); final long term = leader.getState().getCurrentTerm(); List<RaftServerImpl> followers = cluster.getFollowers(); final RaftServerImpl followerToSendLog = followers.get(0); for (int i = 1; i < NUM_SERVERS - 1; i++) { RaftServerImpl follower = followers.get(i); cluster.killServer(follower.getId()); } SimpleMessage[] messages = SimpleMessage.create(1); RaftTestUtil.sendMessageInNewThread(cluster, leaderId, messages); Thread.sleep(cluster.getMaxTimeout() + 100); RaftLog followerLog = followerToSendLog.getState().getLog(); Assert.assertTrue(RaftTestUtil.logEntriesContains(followerLog, messages)); LOG.info(String.format("killing old leader: %s", leaderId.toString())); cluster.killServer(leaderId); for (int i = 1; i < 3; i++) { RaftServerImpl follower = followers.get(i); LOG.info(String.format("restarting follower: %s", follower.getId().toString())); cluster.restartServer(follower.getId(), false ); } Thread.sleep(cluster.getMaxTimeout() * 5); // confirm the server with log is elected as new leader. final RaftPeerId newLeaderId = waitForLeader(cluster).getId(); Assert.assertEquals(followerToSendLog.getId(), newLeaderId); cluster.getServerAliveStream().map(s -> s.getState().getLog()) .forEach(log -> RaftTestUtil.assertLogEntries(log, term, messages)); }
@Test public void testOldLeaderNotCommit() throws Exception { LOG.info("Running testOldLeaderNotCommit"); final MiniRaftCluster cluster = getCluster(); final RaftPeerId leaderId = waitForLeader(cluster).getId(); List<RaftServerImpl> followers = cluster.getFollowers(); final RaftServerImpl followerToCommit = followers.get(0); for (int i = 1; i < NUM_SERVERS - 1; i++) { RaftServerImpl follower = followers.get(i); cluster.killServer(follower.getId()); } SimpleMessage[] messages = SimpleMessage.create(1); sendMessageInNewThread(cluster, messages); Thread.sleep(cluster.getMaxTimeout() + 100); logEntriesContains(followerToCommit.getState().getLog(), messages); cluster.killServer(leaderId); cluster.killServer(followerToCommit.getId()); for (int i = 1; i < NUM_SERVERS - 1; i++) { RaftServerImpl follower = followers.get(i); cluster.restartServer(follower.getId(), false ); } waitForLeader(cluster); Thread.sleep(cluster.getMaxTimeout() + 100); final Predicate<LogEntryProto> predicate = l -> l.getTerm() != 1; cluster.getServerAliveStream() .map(s -> s.getState().getLog()) .forEach(log -> RaftTestUtil.checkLogEntries(log, messages, predicate)); }
@Test public void testFlushMetric() throws Exception { int numMsg = 2; final RaftTestUtil.SimpleMessage[] messages = RaftTestUtil.SimpleMessage.create(numMsg); try (final RaftClient client = cluster.createClient()) { for (RaftTestUtil.SimpleMessage message : messages) { client.send(message); } } for (RaftServerProxy rsp: cluster.getServers()) { String flushTimeMetric = getLogFlushTimeMetric(rsp.getId().toString()); Timer tm = RatisMetricsRegistry.getRegistry().getTimers().get(flushTimeMetric); Assert.assertNotNull(tm); // Number of log entries expected = numMsg + 1 entry for start-log-segment int numExpectedLogEntries = numMsg + 1; Assert.assertEquals(numExpectedLogEntries, tm.getCount()); Assert.assertTrue(tm.getMeanRate() > 0); // Test jmx ObjectName oname = new ObjectName("metrics", "name", flushTimeMetric); Assert.assertEquals(numExpectedLogEntries, ((Long) ManagementFactory.getPlatformMBeanServer().getAttribute(oname, "Count")) .intValue()); } }
void runTestOldLeaderNotCommit(CLUSTER cluster) throws Exception { final RaftPeerId leaderId = waitForLeader(cluster).getId(); List<RaftServerImpl> followers = cluster.getFollowers(); final RaftServerImpl followerToCommit = followers.get(0); for (int i = 1; i < NUM_SERVERS - 1; i++) { RaftServerImpl follower = followers.get(i); cluster.killServer(follower.getId()); } SimpleMessage[] messages = SimpleMessage.create(1); RaftTestUtil.sendMessageInNewThread(cluster, leaderId, messages); Thread.sleep(cluster.getMaxTimeout() + 100); RaftTestUtil.logEntriesContains(followerToCommit.getState().getLog(), messages); cluster.killServer(leaderId); cluster.killServer(followerToCommit.getId()); for (int i = 1; i < NUM_SERVERS - 1; i++) { RaftServerImpl follower = followers.get(i); cluster.restartServer(follower.getId(), false ); } waitForLeader(cluster); Thread.sleep(cluster.getMaxTimeout() + 100); final Predicate<LogEntryProto> predicate = l -> l.getTerm() != 1; cluster.getServerAliveStream() .map(s -> s.getState().getLog()) .forEach(log -> RaftTestUtil.checkLogEntries(log, messages, predicate)); }
static void runTestFlushMetric(MiniRaftCluster cluster) throws Exception { int numMsg = 2; final RaftTestUtil.SimpleMessage[] messages = RaftTestUtil.SimpleMessage.create(numMsg); try (final RaftClient client = cluster.createClient()) { for (RaftTestUtil.SimpleMessage message : messages) { client.send(message); } } // For leader, flush must happen before client can get replies. assertFlushCount(cluster.getLeader()); // For followers, flush can be lagged behind. Attempt multiple times. for(RaftServerImpl f : cluster.getFollowers()) { JavaUtils.attempt(() -> assertFlushCount(f), 10, 100, f.getId() + "-assertFlushCount", null); } }
public static SimpleMessage[] create(int numMessages) { return create(numMessages, "m"); }
public static SimpleMessage[] create(int numMessages) { return create(numMessages, "m"); }
Client4TestWithLoad(int index, int numMessages, boolean useAsync, MiniRaftCluster cluster, Logger LOG) { super("client-" + index); this.index = index; this.messages = SimpleMessage.create(numMessages, index + "-"); this.useAsync = useAsync; this.cluster = cluster; this.LOG = LOG; }
Client4TestWithLoad(int index, int numMessages, boolean useAsync, MiniRaftCluster cluster, Logger LOG) { super("client-" + index); this.index = index; this.messages = SimpleMessage.create(numMessages, index + "-"); this.useAsync = useAsync; this.cluster = cluster; this.LOG = LOG; }