public RaftPeerId getId() { return server.isDone()? server.join().getId(): null; }
@Override public void onNext(AppendEntriesRequestProto request) { final CompletableFuture<Void> current = new CompletableFuture<>(); final CompletableFuture<Void> previous = previousOnNext.getAndSet(current); try { server.appendEntriesAsync(request).thenCombine(previous, (reply, v) -> { if (!isClosed.get()) { if (LOG.isDebugEnabled()) { LOG.debug(server.getId() + ": reply " + ServerProtoUtils.toString(reply)); } responseObserver.onNext(reply); } current.complete(null); return null; }); } catch (Throwable e) { GrpcUtil.warn(LOG, () -> getId() + ": Failed appendEntries " + ProtoUtils.toString(request.getServerRequest()), e); responseObserver.onError(GrpcUtil.wrapException(e, request.getServerRequest().getCallId())); current.completeExceptionally(e); } }
static <SERVER extends RaftServer> void blockQueueAndSetDelay( Collection<SERVER> servers, DelayLocalExecutionInjection injection, String leaderId, int delayMs, long maxTimeout) throws InterruptedException { // block reqeusts sent to leader if delayMs > 0 final boolean block = delayMs > 0; LOG.debug("{} requests sent to leader {} and set {}ms delay for the others", block? "Block": "Unblock", leaderId, delayMs); if (block) { BlockRequestHandlingInjection.getInstance().blockReplier(leaderId); } else { BlockRequestHandlingInjection.getInstance().unblockReplier(leaderId); } // delay RaftServerRequest for other servers servers.stream().filter(s -> !s.getId().toString().equals(leaderId)) .forEach(s -> { if (block) { injection.setDelayMs(s.getId().toString(), delayMs); } else { injection.removeDelay(s.getId().toString()); } }); Thread.sleep(3 * maxTimeout); }
SimulatedServerRpc(RaftServer server, SimulatedRequestReply<RaftServerRequest, RaftServerReply> serverRequestReply, SimulatedRequestReply<RaftClientRequest, RaftClientReply> clientRequestReply) { this.server = (RaftServerProxy)server; final Supplier<String> id = () -> server.getId().toString(); this.serverHandler = new RequestHandler<>(id, "serverHandler", serverRequestReply, serverHandlerImpl, 3); this.clientHandler = new RequestHandler<>(id, "clientHandler", clientRequestReply, clientHandlerImpl, 3); }
SimulatedServerRpc(RaftServer server, SimulatedRequestReply<RaftServerRequest, RaftServerReply> serverRequestReply, SimulatedRequestReply<RaftClientRequest, RaftClientReply> clientRequestReply) { this.server = (RaftServerProxy)server; final Supplier<String> id = () -> server.getId().toString(); this.serverHandler = new RequestHandler<>(id, "serverHandler", serverRequestReply, serverHandlerImpl, 3); this.clientHandler = new RequestHandler<>(id, "clientHandler", clientRequestReply, clientHandlerImpl, 3); }
static <SERVER extends RaftServer> void blockQueueAndSetDelay( Collection<SERVER> servers, DelayLocalExecutionInjection injection, String leaderId, int delayMs, long maxTimeout) throws InterruptedException { // block reqeusts sent to leader if delayMs > 0 final boolean block = delayMs > 0; LOG.debug("{} requests sent to leader {} and set {}ms delay for the others", block? "Block": "Unblock", leaderId, delayMs); if (block) { BlockRequestHandlingInjection.getInstance().blockReplier(leaderId); } else { BlockRequestHandlingInjection.getInstance().unblockReplier(leaderId); } // delay RaftServerRequest for other servers servers.stream().filter(s -> !s.getId().toString().equals(leaderId)) .forEach(s -> { if (block) { injection.setDelayMs(s.getId().toString(), delayMs); } else { injection.removeDelay(s.getId().toString()); } }); Thread.sleep(3 * maxTimeout); }
async, replication, killLeader, numMessages); for (RaftServer s : cluster.getServers()) { cluster.restartServer(s.getId(), false);
async, killLeader, numMessages); for (RaftServer s : cluster.getServers()) { cluster.restartServer(s.getId(), false);