public static RaftResponseMessage bytesToResponseMessage(byte[] data){ if(data == null || data.length != RAFT_RESPONSE_HEADER_SIZE){ throw new IllegalArgumentException(String.format("data must have %d bytes for a raft response message", RAFT_RESPONSE_HEADER_SIZE)); } ByteBuffer buffer = ByteBuffer.wrap(data); RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.fromByte(buffer.get())); response.setSource(buffer.getInt()); response.setDestination(buffer.getInt()); response.setTerm(buffer.getLong()); response.setNextIndex(buffer.getLong()); response.setAccepted(buffer.get() == 1); return response; }
public static RaftResponseMessage bytesToResponseMessage(byte[] data){ if(data == null || data.length != RAFT_RESPONSE_HEADER_SIZE){ throw new IllegalArgumentException(String.format("data must have %d bytes for a raft response message", RAFT_RESPONSE_HEADER_SIZE)); } ByteBuffer buffer = ByteBuffer.wrap(data); RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.fromByte(buffer.get())); response.setSource(buffer.getInt()); response.setDestination(buffer.getInt()); response.setTerm(buffer.getLong()); response.setNextIndex(buffer.getLong()); response.setAccepted(buffer.get() == 1); return response; }
private RaftResponseMessage randomResponse(int source, long term){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(this.randomMessageType()); response.setAccepted(this.random.nextBoolean()); response.setDestination(source); response.setSource(this.random.nextInt()); response.setTerm(term); response.setNextIndex(this.random.nextLong()); return response; } }
private RaftResponseMessage randomResponse(int source, long term){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(this.randomMessageType()); response.setAccepted(this.random.nextBoolean()); response.setDestination(source); response.setSource(this.random.nextInt()); response.setTerm(term); response.setNextIndex(this.random.nextLong()); return response; } }
private RaftResponseMessage handleLeaveClusterRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.LeaveClusterResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); if(!this.configChanging){ this.steppingDown = 2; response.setAccepted(true); }else{ response.setAccepted(false); } return response; }
private RaftResponseMessage handleLeaveClusterRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.LeaveClusterResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); if(!this.configChanging){ this.steppingDown = 2; response.setAccepted(true); }else{ response.setAccepted(false); } return response; }
private RaftResponseMessage handleLeaveClusterRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.LeaveClusterResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); if(!this.configChanging){ this.steppingDown = 2; response.setAccepted(true); }else{ response.setAccepted(false); } return response; }
response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.AddServerResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.ClusterServer){ response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(true); return response;
response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.AddServerResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.ClusterServer){ response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(true); return response;
response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.AddServerResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.ClusterServer){ response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(true); return response;
this.logger.info("received an install snapshot request which has lower term than this server, decline the request"); response.setAccepted(false); response.setNextIndex(0); return response; if(logEntries == null || logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.SnapshotSyncRequest){ this.logger.warning("Receive an invalid InstallSnapshotRequest due to bad log entries or bad log entry value"); response.setNextIndex(0); response.setAccepted(false); return response; response.setNextIndex(0); response.setAccepted(false); return response; response.setNextIndex(snapshotSyncRequest.getOffset() + snapshotSyncRequest.getData().length); // the next index will be ignored if "accept" is false return response;
private RaftResponseMessage handleLogSyncRequest(RaftRequestMessage request){ LogEntry[] logEntries = request.getLogEntries(); RaftResponseMessage response = new RaftResponseMessage(); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.SyncLogResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries == null || logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.LogPack || logEntries[0].getValue() == null || logEntries[0].getValue().length == 0){ this.logger.info("receive an invalid LogSyncRequest as the log entry value doesn't meet the requirements"); return response; } if(!this.catchingUp){ this.logger.debug("This server is ready for cluster, ignore the request"); return response; } this.logStore.applyLogPack(request.getLastLogIndex() + 1, logEntries[0].getValue()); this.commit(this.logStore.getFirstAvailableIndex() -1); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(true); return response; }
private RaftResponseMessage handleLogSyncRequest(RaftRequestMessage request){ LogEntry[] logEntries = request.getLogEntries(); RaftResponseMessage response = new RaftResponseMessage(); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.SyncLogResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries == null || logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.LogPack || logEntries[0].getValue() == null || logEntries[0].getValue().length == 0){ this.logger.info("receive an invalid LogSyncRequest as the log entry value doesn't meet the requirements"); return response; } if(!this.catchingUp){ this.logger.debug("This server is ready for cluster, ignore the request"); return response; } this.logStore.applyLogPack(request.getLastLogIndex() + 1, logEntries[0].getValue()); this.commit(this.logStore.getFirstAvailableIndex() -1); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(true); return response; }
private RaftResponseMessage handleLogSyncRequest(RaftRequestMessage request){ LogEntry[] logEntries = request.getLogEntries(); RaftResponseMessage response = new RaftResponseMessage(); response.setSource(this.id); response.setDestination(request.getSource()); response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.SyncLogResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries == null || logEntries.length != 1 || logEntries[0].getValueType() != LogValueType.LogPack || logEntries[0].getValue() == null || logEntries[0].getValue().length == 0){ this.logger.info("receive an invalid LogSyncRequest as the log entry value doesn't meet the requirements"); return response; } if(!this.catchingUp){ this.logger.debug("This server is ready for cluster, ignore the request"); return response; } this.logStore.applyLogPack(request.getLastLogIndex() + 1, logEntries[0].getValue()); this.commit(this.logStore.getFirstAvailableIndex() -1); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(true); return response; }
private RaftResponseMessage handleClientRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.AppendEntriesResponse); response.setSource(this.id); response.setDestination(this.leader); response.setTerm(this.state.getTerm()); long term; synchronized(this){ if(this.role != ServerRole.Leader){ response.setAccepted(false); return response; } term = this.state.getTerm(); } LogEntry[] logEntries = request.getLogEntries(); if(logEntries != null && logEntries.length > 0){ for(int i = 0; i < logEntries.length; ++i){ this.stateMachine.preCommit(this.logStore.append(new LogEntry(term, logEntries[i].getValue())), logEntries[i].getValue()); } } // Urgent commit, so that the commit will not depend on heartbeat this.requestAppendEntries(); response.setAccepted(true); response.setNextIndex(this.logStore.getFirstAvailableIndex()); return response; }
private RaftResponseMessage handleClientRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.AppendEntriesResponse); response.setSource(this.id); response.setDestination(this.leader); response.setTerm(this.state.getTerm()); long term; synchronized(this){ if(this.role != ServerRole.Leader){ response.setAccepted(false); return response; } term = this.state.getTerm(); } LogEntry[] logEntries = request.getLogEntries(); if(logEntries != null && logEntries.length > 0){ for(int i = 0; i < logEntries.length; ++i){ this.stateMachine.preCommit(this.logStore.append(new LogEntry(term, logEntries[i].getValue())), logEntries[i].getValue()); } } // Urgent commit, so that the commit will not depend on heartbeat this.requestAppendEntries(); response.setAccepted(true); response.setNextIndex(this.logStore.getFirstAvailableIndex()); return response; }
private RaftResponseMessage handleClientRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.AppendEntriesResponse); response.setSource(this.id); response.setDestination(this.leader); response.setTerm(this.state.getTerm()); long term; synchronized(this){ if(this.role != ServerRole.Leader){ response.setAccepted(false); return response; } term = this.state.getTerm(); } LogEntry[] logEntries = request.getLogEntries(); if(logEntries != null && logEntries.length > 0){ for(int i = 0; i < logEntries.length; ++i){ this.stateMachine.preCommit(this.logStore.append(new LogEntry(term, logEntries[i].getValue())), logEntries[i].getValue()); } } // Urgent commit, so that the commit will not depend on heartbeat this.requestAppendEntries(); response.setAccepted(true); response.setNextIndex(this.logStore.getFirstAvailableIndex()); return response; }
response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.JoinClusterResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries == null ||
response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.JoinClusterResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries == null ||
response.setTerm(this.state.getTerm()); response.setMessageType(RaftMessageType.JoinClusterResponse); response.setNextIndex(this.logStore.getFirstAvailableIndex()); response.setAccepted(false); if(logEntries == null ||