public static byte[] messageToBytes(RaftRequestMessage request){ LogEntry[] logEntries = request.getLogEntries(); int logSize = 0; List<byte[]> buffersForLogs = null; if(logEntries != null && logEntries.length > 0){ buffersForLogs = new ArrayList<byte[]>(logEntries.length); for(LogEntry logEntry : logEntries){ byte[] logData = logEntryToBytes(logEntry); logSize += logData.length; buffersForLogs.add(logData); } } ByteBuffer requestBuffer = ByteBuffer.allocate(RAFT_REQUEST_HEADER_SIZE + logSize); requestBuffer.put(request.getMessageType().toByte()); requestBuffer.put(intToBytes(request.getSource())); requestBuffer.put(intToBytes(request.getDestination())); requestBuffer.put(longToBytes(request.getTerm())); requestBuffer.put(longToBytes(request.getLastLogTerm())); requestBuffer.put(longToBytes(request.getLastLogIndex())); requestBuffer.put(longToBytes(request.getCommitIndex())); requestBuffer.put(intToBytes(logSize)); if(buffersForLogs != null){ for(byte[] logData : buffersForLogs){ requestBuffer.put(logData); } } return requestBuffer.array(); }
public static byte[] messageToBytes(RaftRequestMessage request){ LogEntry[] logEntries = request.getLogEntries(); int logSize = 0; List<byte[]> buffersForLogs = null; if(logEntries != null && logEntries.length > 0){ buffersForLogs = new ArrayList<byte[]>(logEntries.length); for(LogEntry logEntry : logEntries){ byte[] logData = logEntryToBytes(logEntry); logSize += logData.length; buffersForLogs.add(logData); } } ByteBuffer requestBuffer = ByteBuffer.allocate(RAFT_REQUEST_HEADER_SIZE + logSize); requestBuffer.put(request.getMessageType().toByte()); requestBuffer.put(intToBytes(request.getSource())); requestBuffer.put(intToBytes(request.getDestination())); requestBuffer.put(longToBytes(request.getTerm())); requestBuffer.put(longToBytes(request.getLastLogTerm())); requestBuffer.put(longToBytes(request.getLastLogIndex())); requestBuffer.put(longToBytes(request.getCommitIndex())); requestBuffer.put(intToBytes(logSize)); if(buffersForLogs != null){ for(byte[] logData : buffersForLogs){ requestBuffer.put(logData); } } return requestBuffer.array(); }
@Override public RaftResponseMessage processRequest(RaftRequestMessage request) { String log = String.format( "Receive a request(Source: %d, Destination: %d, Term: %d, LLI: %d, LLT: %d, CI: %d, LEL: %d", request.getSource(), request.getDestination(), request.getTerm(), request.getLastLogIndex(), request.getLastLogTerm(), request.getCommitIndex(), request.getLogEntries() == null ? 0 : request.getLogEntries().length); logger.debug(log); System.out.println(log); return this.randomResponse(request.getSource(), request.getTerm()); }
@Override public RaftResponseMessage processRequest(RaftRequestMessage request) { String log = String.format( "Receive a request(Source: %d, Destination: %d, Term: %d, LLI: %d, LLT: %d, CI: %d, LEL: %d", request.getSource(), request.getDestination(), request.getTerm(), request.getLastLogIndex(), request.getLastLogTerm(), request.getCommitIndex(), request.getLogEntries() == null ? 0 : request.getLogEntries().length); logger.debug(log); System.out.println(log); return this.randomResponse(request.getSource(), request.getTerm()); }
private synchronized RaftResponseMessage handleVoteRequest(RaftRequestMessage request){ // we allow the server to be continue after term updated to save a round message this.updateTerm(request.getTerm()); // Reset stepping down value to prevent this server goes down when leader crashes after sending a LeaveClusterRequest if(this.steppingDown > 0){ this.steppingDown = 2; } RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.RequestVoteResponse); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); boolean logOkay = request.getLastLogTerm() > this.logStore.getLastLogEntry().getTerm() || (request.getLastLogTerm() == this.logStore.getLastLogEntry().getTerm() && this.logStore.getFirstAvailableIndex() - 1 <= request.getLastLogIndex()); boolean grant = request.getTerm() == this.state.getTerm() && logOkay && (this.state.getVotedFor() == request.getSource() || this.state.getVotedFor() == -1); response.setAccepted(grant); if(grant){ this.state.setVotedFor(request.getSource()); this.context.getServerStateManager().persistState(this.state); } return response; }
private synchronized RaftResponseMessage handleVoteRequest(RaftRequestMessage request){ // we allow the server to be continue after term updated to save a round message this.updateTerm(request.getTerm()); // Reset stepping down value to prevent this server goes down when leader crashes after sending a LeaveClusterRequest if(this.steppingDown > 0){ this.steppingDown = 2; } RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.RequestVoteResponse); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); boolean logOkay = request.getLastLogTerm() > this.logStore.getLastLogEntry().getTerm() || (request.getLastLogTerm() == this.logStore.getLastLogEntry().getTerm() && this.logStore.getFirstAvailableIndex() - 1 <= request.getLastLogIndex()); boolean grant = request.getTerm() == this.state.getTerm() && logOkay && (this.state.getVotedFor() == request.getSource() || this.state.getVotedFor() == -1); response.setAccepted(grant); if(grant){ this.state.setVotedFor(request.getSource()); this.context.getServerStateManager().persistState(this.state); } return response; }
private synchronized RaftResponseMessage handleVoteRequest(RaftRequestMessage request){ // we allow the server to be continue after term updated to save a round message this.updateTerm(request.getTerm()); // Reset stepping down value to prevent this server goes down when leader crashes after sending a LeaveClusterRequest if(this.steppingDown > 0){ this.steppingDown = 2; } RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.RequestVoteResponse); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); boolean logOkay = request.getLastLogTerm() > this.logStore.getLastLogEntry().getTerm() || (request.getLastLogTerm() == this.logStore.getLastLogEntry().getTerm() && this.logStore.getFirstAvailableIndex() - 1 <= request.getLastLogIndex()); boolean grant = request.getTerm() == this.state.getTerm() && logOkay && (this.state.getVotedFor() == request.getSource() || this.state.getVotedFor() == -1); response.setAccepted(grant); if(grant){ this.state.setVotedFor(request.getSource()); this.context.getServerStateManager().persistState(this.state); } return response; }
request.getSource(), request.getLastLogIndex(), request.getLastLogTerm(), request.getLogEntries() == null ? 0 : request.getLogEntries().length, request.getCommitIndex(),
request.getSource(), request.getLastLogIndex(), request.getLastLogTerm(), request.getLogEntries() == null ? 0 : request.getLogEntries().length, request.getCommitIndex(),
request.getSource(), request.getLastLogIndex(), request.getLastLogTerm(), request.getLogEntries() == null ? 0 : request.getLogEntries().length, request.getCommitIndex(),
request.getLastLogTerm() == this.termForLastLog(request.getLastLogIndex())); if(request.getTerm() < this.state.getTerm() || !logOkay){ response.setAccepted(false);
request.getLastLogTerm() == this.termForLastLog(request.getLastLogIndex())); if(request.getTerm() < this.state.getTerm() || !logOkay){ response.setAccepted(false);
request.getLastLogTerm() == this.termForLastLog(request.getLastLogIndex())); if(request.getTerm() < this.state.getTerm() || !logOkay){ response.setAccepted(false);