public static Pair<RaftRequestMessage, Integer> bytesToRequestMessage(byte[] data){ if(data == null || data.length != RAFT_REQUEST_HEADER_SIZE){ throw new IllegalArgumentException("invalid request message header."); } ByteBuffer buffer = ByteBuffer.wrap(data); RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.fromByte(buffer.get())); request.setSource(buffer.getInt()); request.setDestination(buffer.getInt()); request.setTerm(buffer.getLong()); request.setLastLogTerm(buffer.getLong()); request.setLastLogIndex(buffer.getLong()); request.setCommitIndex(buffer.getLong()); int logDataSize = buffer.getInt(); return new Pair<RaftRequestMessage, Integer>(request, logDataSize); }
public static Pair<RaftRequestMessage, Integer> bytesToRequestMessage(byte[] data){ if(data == null || data.length != RAFT_REQUEST_HEADER_SIZE){ throw new IllegalArgumentException("invalid request message header."); } ByteBuffer buffer = ByteBuffer.wrap(data); RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.fromByte(buffer.get())); request.setSource(buffer.getInt()); request.setDestination(buffer.getInt()); request.setTerm(buffer.getLong()); request.setLastLogTerm(buffer.getLong()); request.setLastLogIndex(buffer.getLong()); request.setCommitIndex(buffer.getLong()); int logDataSize = buffer.getInt(); return new Pair<RaftRequestMessage, Integer>(request, logDataSize); }
private static RaftRequestMessage randomRequest(){ RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(randomMessageType());; request.setCommitIndex(random.nextLong()); request.setDestination(random.nextInt()); request.setLastLogIndex(random.nextLong()); request.setLastLogTerm(random.nextLong()); request.setSource(random.nextInt()); request.setTerm(random.nextLong()); LogEntry[] entries = new LogEntry[random.nextInt(20) + 1]; for(int i = 0; i < entries.length; ++i){ entries[i] = randomLogEntry(); } request.setLogEntries(entries); return request; }
private static RaftRequestMessage randomRequest(){ RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(randomMessageType());; request.setCommitIndex(random.nextLong()); request.setDestination(random.nextInt()); request.setLastLogIndex(random.nextLong()); request.setLastLogTerm(random.nextLong()); request.setSource(random.nextInt()); request.setTerm(random.nextLong()); LogEntry[] entries = new LogEntry[random.nextInt(20) + 1]; for(int i = 0; i < entries.length; ++i){ entries[i] = randomLogEntry(); } request.setLogEntries(entries); return request; }
private void requestVote(){ // vote for self this.logger.info("requestVote started with term %d", this.state.getTerm()); this.state.setVotedFor(this.id); this.context.getServerStateManager().persistState(this.state); this.votesGranted += 1; this.votedServers.add(this.id); // this is the only server? if(this.votesGranted > (this.peers.size() + 1) / 2){ this.electionCompleted = true; this.becomeLeader(); return; } for(PeerServer peer : this.peers.values()){ RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.RequestVoteRequest); request.setDestination(peer.getId()); request.setSource(this.id); request.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); request.setLastLogTerm(this.termForLastLog(this.logStore.getFirstAvailableIndex() - 1)); request.setTerm(this.state.getTerm()); this.logger.debug("send %s to server %d with term %d", RaftMessageType.RequestVoteRequest.toString(), peer.getId(), this.state.getTerm()); peer.SendRequest(request).whenCompleteAsync((RaftResponseMessage response, Throwable error) -> { handlePeerResponse(response, error); }, this.context.getScheduledExecutor()); } }
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 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 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 requestVote(){ // vote for self this.logger.info("requestVote started with term %d", this.state.getTerm()); this.state.setVotedFor(this.id); this.context.getServerStateManager().persistState(this.state); this.votesGranted += 1; this.votesResponded += 1; // this is the only server? if(this.votesGranted > (this.peers.size() + 1) / 2){ this.electionCompleted = true; this.becomeLeader(); return; } for(PeerServer peer : this.peers.values()){ RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.RequestVoteRequest); request.setDestination(peer.getId()); request.setSource(this.id); request.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); request.setLastLogTerm(this.termForLastLog(this.logStore.getFirstAvailableIndex() - 1)); request.setTerm(this.state.getTerm()); this.logger.debug("send %s to server %d with term %d", RaftMessageType.RequestVoteRequest.toString(), peer.getId(), this.state.getTerm()); peer.SendRequest(request).whenCompleteAsync((RaftResponseMessage response, Throwable error) -> { handlePeerResponse(response, error); }, this.context.getScheduledExecutor()); } }
private void requestVote(){ // vote for self this.logger.info("requestVote started with term %d", this.state.getTerm()); this.state.setVotedFor(this.id); this.context.getServerStateManager().persistState(this.state); this.votesGranted += 1; this.votesResponded += 1; // this is the only server? if(this.votesGranted > (this.peers.size() + 1) / 2){ this.electionCompleted = true; this.becomeLeader(); return; } for(PeerServer peer : this.peers.values()){ RaftRequestMessage request = new RaftRequestMessage(); request.setMessageType(RaftMessageType.RequestVoteRequest); request.setDestination(peer.getId()); request.setSource(this.id); request.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); request.setLastLogTerm(this.termForLastLog(this.logStore.getFirstAvailableIndex() - 1)); request.setTerm(this.state.getTerm()); this.logger.debug("send %s to server %d with term %d", RaftMessageType.RequestVoteRequest.toString(), peer.getId(), this.state.getTerm()); peer.SendRequest(request).whenCompleteAsync((RaftResponseMessage response, Throwable error) -> { handlePeerResponse(response, error); }, this.context.getScheduledExecutor()); } }
requestMessage.setSource(this.id); requestMessage.setDestination(peer.getId()); requestMessage.setLastLogIndex(lastLogIndex); requestMessage.setLastLogTerm(lastLogTerm); requestMessage.setLogEntries(logEntries);
leaveClusterRequest.setCommitIndex(this.quickCommitIndex); leaveClusterRequest.setDestination(peer.getId()); leaveClusterRequest.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); leaveClusterRequest.setLastLogTerm(0); leaveClusterRequest.setTerm(this.state.getTerm());
leaveClusterRequest.setCommitIndex(this.quickCommitIndex); leaveClusterRequest.setDestination(peer.getId()); leaveClusterRequest.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); leaveClusterRequest.setLastLogTerm(0); leaveClusterRequest.setTerm(this.state.getTerm());
leaveClusterRequest.setCommitIndex(this.quickCommitIndex); leaveClusterRequest.setDestination(peer.getId()); leaveClusterRequest.setLastLogIndex(this.logStore.getFirstAvailableIndex() - 1); leaveClusterRequest.setLastLogTerm(0); leaveClusterRequest.setTerm(this.state.getTerm());
request.setTerm(this.state.getTerm()); request.setMessageType(RaftMessageType.SyncLogRequest); request.setLastLogIndex(startIndex - 1); request.setLogEntries(new LogEntry[] { new LogEntry(this.state.getTerm(), logPack, LogValueType.LogPack) });
request.setTerm(this.state.getTerm()); request.setMessageType(RaftMessageType.SyncLogRequest); request.setLastLogIndex(startIndex - 1); request.setLogEntries(new LogEntry[] { new LogEntry(this.state.getTerm(), logPack, LogValueType.LogPack) });
request.setTerm(this.state.getTerm()); request.setMessageType(RaftMessageType.SyncLogRequest); request.setLastLogIndex(startIndex - 1); request.setLogEntries(new LogEntry[] { new LogEntry(this.state.getTerm(), logPack, LogValueType.LogPack) });
requestMessage.setSource(this.id); requestMessage.setDestination(peer.getId()); requestMessage.setLastLogIndex(lastLogIndex); requestMessage.setLastLogTerm(lastLogTerm); requestMessage.setLogEntries(logEntries);
requestMessage.setSource(this.id); requestMessage.setDestination(peer.getId()); requestMessage.setLastLogIndex(snapshot.getLastLogIndex()); requestMessage.setLastLogTerm(snapshot.getLastLogTerm()); requestMessage.setLogEntries(new LogEntry[] { new LogEntry(term, syncRequest.toBytes(), LogValueType.SnapshotSyncRequest) });
requestMessage.setSource(this.id); requestMessage.setDestination(peer.getId()); requestMessage.setLastLogIndex(snapshot.getLastLogIndex()); requestMessage.setLastLogTerm(snapshot.getLastLogTerm()); requestMessage.setLogEntries(new LogEntry[] { new LogEntry(term, syncRequest.toBytes(), LogValueType.SnapshotSyncRequest) });