@Override public CompletableFuture<Boolean> addServer(ClusterServer server) { LogEntry[] logEntries = new LogEntry[1]; logEntries[0] = new LogEntry(0, server.toBytes(), LogValueType.ClusterServer); RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.AddServerRequest); request.setLogEntries(logEntries); return this.sendMessageToLeader(request); }
private boolean updateTerm(long term){ if(term > this.state.getTerm()){ this.state.setTerm(term); this.state.setVotedFor(-1); this.electionCompleted = false; this.votesGranted = 0; this.votesResponded = 0; this.context.getServerStateManager().persistState(this.state); this.becomeFollower(); return true; } return false; }
private int getSnapshotSyncBlockSize(){ int blockSize = this.context.getRaftParameters().getSnapshotBlockSize(); return blockSize == 0 ? DEFAULT_SNAPSHOT_SYNC_BLOCK_SIZE : blockSize; }
private void inviteServerToJoinCluster(){ RaftRequestMessage request = new RaftRequestMessage(); request.setCommitIndex(this.quickCommitIndex); request.setDestination(this.serverToJoin.getId()); request.setSource(this.id); request.setTerm(this.state.getTerm()); request.setMessageType(RaftMessageType.JoinClusterRequest); request.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); request.setLogEntries(new LogEntry[] { new LogEntry(this.state.getTerm(), this.config.toBytes(), LogValueType.Configuration) }); this.serverToJoin.SendRequest(request).whenCompleteAsync((RaftResponseMessage response, Throwable error) -> { this.handleExtendedResponse(response, error); }, this.context.getScheduledExecutor()); }
private void removeServerFromCluster(int serverId){ ClusterConfiguration newConfig = new ClusterConfiguration(); newConfig.setLastLogIndex(this.config.getLogIndex()); newConfig.setLogIndex(this.logStore.getFirstAvailableIndex()); for(ClusterServer server: this.config.getServers()){ if(server.getId() != serverId){ newConfig.getServers().add(server); } } this.logger.info("removed a server from configuration and save the configuration to log store at %d", newConfig.getLogIndex()); this.configChanging = true; this.logStore.append(new LogEntry(this.state.getTerm(), newConfig.toBytes(), LogValueType.Configuration)); this.requestAppendEntries(); }
@Override public Void call() throws Exception { self.logger.debug("retrying the request %s", request.getMessageType().toString()); server.SendRequest(request).whenCompleteAsync((RaftResponseMessage furtherResponse, Throwable furtherError) -> { self.handleExtendedResponse(furtherResponse, furtherError); }, self.context.getScheduledExecutor()); return null; }}, server.getCurrentHeartbeatInterval(), TimeUnit.MILLISECONDS); }
public static RaftMessageSender run(RaftContext context){ if(context == null){ throw new IllegalArgumentException("context cannot be null"); } RaftServer server = new RaftServer(context); RaftMessageSender messageSender = server.createMessageSender(); context.getStateMachine().start(messageSender); context.getRpcListener().startListening(server); return messageSender; } }
private String getLeaderEndpoint(){ for(ClusterServer server : this.configuration.getServers()){ if(server.getId() == this.leaderId){ return server.getEndpoint(); } } logger.info("no endpoint could be found for leader %d, that usually means no leader is elected, retry the first one", this.leaderId); this.randomLeader = true; this.leaderId = this.configuration.getServers().get(0).getId(); return this.configuration.getServers().get(0).getEndpoint(); } }
private void inviteServerToJoinCluster(){ RaftRequestMessage request = new RaftRequestMessage(); request.setCommitIndex(this.quickCommitIndex); request.setDestination(this.serverToJoin.getId()); request.setSource(this.id); request.setTerm(this.state.getTerm()); request.setMessageType(RaftMessageType.JoinClusterRequest); request.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); request.setLogEntries(new LogEntry[] { new LogEntry(this.state.getTerm(), this.config.toBytes(), LogValueType.Configuration) }); this.serverToJoin.SendRequest(request).whenCompleteAsync((RaftResponseMessage response, Throwable error) -> { this.handleExtendedResponse(response, error); }, this.context.getScheduledExecutor()); }
private void removeServerFromCluster(int serverId){ ClusterConfiguration newConfig = new ClusterConfiguration(); newConfig.setLastLogIndex(this.config.getLogIndex()); newConfig.setLogIndex(this.logStore.getFirstAvailableIndex()); for(ClusterServer server: this.config.getServers()){ if(server.getId() != serverId){ newConfig.getServers().add(server); } } this.logger.info("removed a server from configuration and save the configuration to log store at %d", newConfig.getLogIndex()); this.configChanging = true; this.logStore.append(new LogEntry(this.state.getTerm(), newConfig.toBytes(), LogValueType.Configuration)); this.requestAppendEntries(); }
@Override public CompletableFuture<Boolean> addServer(ClusterServer server) { LogEntry[] logEntries = new LogEntry[1]; logEntries[0] = new LogEntry(0, server.toBytes(), LogValueType.ClusterServer); RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.AddServerRequest); request.setLogEntries(logEntries); return this.sendMessageToLeader(request); }
private boolean updateTerm(long term){ if(term > this.state.getTerm()){ this.state.setTerm(term); this.state.setVotedFor(-1); this.electionCompleted = false; this.votesGranted = 0; this.votesResponded = 0; this.context.getServerStateManager().persistState(this.state); this.becomeFollower(); return true; } return false; }
@Override public Void call() throws Exception { self.logger.debug("retrying the request %s", request.getMessageType().toString()); server.SendRequest(request).whenCompleteAsync((RaftResponseMessage furtherResponse, Throwable furtherError) -> { self.handleExtendedResponse(furtherResponse, furtherError); }, self.context.getScheduledExecutor()); return null; }}, server.getCurrentHeartbeatInterval(), TimeUnit.MILLISECONDS); }
public static RaftMessageSender run(RaftContext context){ if(context == null){ throw new IllegalArgumentException("context cannot be null"); } RaftServer server = new RaftServer(context); RaftMessageSender messageSender = server.createMessageSender(); context.getStateMachine().start(messageSender); context.getRpcListener().startListening(server); return messageSender; } }
private String getLeaderEndpoint(){ for(ClusterServer server : this.configuration.getServers()){ if(server.getId() == this.leaderId){ return server.getEndpoint(); } } logger.info("no endpoint could be found for leader %d, that usually means no leader is elected, retry the first one", this.leaderId); this.randomLeader = true; this.leaderId = this.configuration.getServers().get(0).getId(); return this.configuration.getServers().get(0).getEndpoint(); } }
private void inviteServerToJoinCluster(){ RaftRequestMessage request = new RaftRequestMessage(); request.setCommitIndex(this.quickCommitIndex); request.setDestination(this.serverToJoin.getId()); request.setSource(this.id); request.setTerm(this.state.getTerm()); request.setMessageType(RaftMessageType.JoinClusterRequest); request.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); request.setLogEntries(new LogEntry[] { new LogEntry(this.state.getTerm(), this.config.toBytes(), LogValueType.Configuration) }); this.serverToJoin.SendRequest(request).whenCompleteAsync((RaftResponseMessage response, Throwable error) -> { this.handleExtendedResponse(response, error); }, this.context.getScheduledExecutor()); }
private void removeServerFromCluster(int serverId){ ClusterConfiguration newConfig = new ClusterConfiguration(); newConfig.setLastLogIndex(this.config.getLogIndex()); newConfig.setLogIndex(this.logStore.getFirstAvailableIndex()); for(ClusterServer server: this.config.getServers()){ if(server.getId() != serverId){ newConfig.getServers().add(server); } } this.logger.info("removed a server from configuration and save the configuration to log store at %d", newConfig.getLogIndex()); this.configChanging = true; this.logStore.append(new LogEntry(this.state.getTerm(), newConfig.toBytes(), LogValueType.Configuration)); this.requestAppendEntries(); }
@Override public CompletableFuture<Boolean> addServer(ClusterServer server) { LogEntry[] logEntries = new LogEntry[1]; logEntries[0] = new LogEntry(0, server.toBytes(), LogValueType.ClusterServer); RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.AddServerRequest); request.setLogEntries(logEntries); return this.sendMessageToLeader(request); }
private boolean updateTerm(long term){ if(term > this.state.getTerm()){ this.state.setTerm(term); this.state.setVotedFor(-1); this.electionCompleted = false; this.votesGranted = 0; this.votedServers.clear(); this.context.getServerStateManager().persistState(this.state); this.becomeFollower(); return true; } return false; }
@Override public Void call() throws Exception { self.logger.debug("retrying the request %s", request.getMessageType().toString()); server.SendRequest(request).whenCompleteAsync((RaftResponseMessage furtherResponse, Throwable furtherError) -> { self.handleExtendedResponse(furtherResponse, furtherError); }, self.context.getScheduledExecutor()); return null; }}, server.getCurrentHeartbeatInterval(), TimeUnit.MILLISECONDS); }