private static RaftMessageType randomMessageType(){ byte value = (byte)random.nextInt(5); return RaftMessageType.fromByte((byte) (value + 1)); }
public static byte[] messageToBytes(RaftResponseMessage response){ ByteBuffer buffer = ByteBuffer.allocate(RAFT_RESPONSE_HEADER_SIZE); buffer.put(response.getMessageType().toByte()); buffer.put(intToBytes(response.getSource())); buffer.put(intToBytes(response.getDestination())); buffer.put(longToBytes(response.getTerm())); buffer.put(longToBytes(response.getNextIndex())); buffer.put(booleanToByte(response.isAccepted())); return buffer.array(); }
@Override public synchronized CompletableFuture<RaftResponseMessage> send(final RaftRequestMessage request) { this.logger.debug(String.format("trying to send message %s to server %d at endpoint %s", request.getMessageType().toString(), request.getDestination(), this.remote.toString())); CompletableFuture<RaftResponseMessage> result = new CompletableFuture<RaftResponseMessage>(); if(this.connection == null || !this.connection.isOpen()){ try{ this.connection = AsynchronousSocketChannel.open(this.channelGroup); this.connection.connect(this.remote, new AsyncTask<RaftRequestMessage>(request, result), handlerFrom((Void v, AsyncTask<RaftRequestMessage> task) -> { sendAndRead(task, false); })); }catch(Throwable error){ closeSocket(); result.completeExceptionally(error); } }else{ this.sendAndRead(new AsyncTask<RaftRequestMessage>(request, result), false); } return result; }
@Override public synchronized CompletableFuture<RaftResponseMessage> send(final RaftRequestMessage request) { this.logger.debug(String.format("trying to send message %s to server %d at endpoint %s", request.getMessageType().toString(), request.getDestination(), this.remote.toString())); CompletableFuture<RaftResponseMessage> result = new CompletableFuture<RaftResponseMessage>(); if(this.connection == null || !this.connection.isOpen()){ try{ this.connection = AsynchronousSocketChannel.open(this.channelGroup); this.connection.connect(this.remote, new AsyncTask<RaftRequestMessage>(request, result), handlerFrom((Void v, AsyncTask<RaftRequestMessage> task) -> { sendAndRead(task, false); })); }catch(Throwable error){ closeSocket(); result.completeExceptionally(error); } }else{ this.sendAndRead(new AsyncTask<RaftRequestMessage>(request, result), false); } return result; }
@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); }
private RaftMessageType randomMessageType(){ byte value = (byte)this.random.nextInt(5); return RaftMessageType.fromByte((byte) (value + 1)); }
public static byte[] messageToBytes(RaftResponseMessage response){ ByteBuffer buffer = ByteBuffer.allocate(RAFT_RESPONSE_HEADER_SIZE); buffer.put(response.getMessageType().toByte()); buffer.put(intToBytes(response.getSource())); buffer.put(intToBytes(response.getDestination())); buffer.put(longToBytes(response.getTerm())); buffer.put(longToBytes(response.getNextIndex())); buffer.put(booleanToByte(response.isAccepted())); return buffer.array(); }
@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); }
private RaftMessageType randomMessageType(){ byte value = (byte)this.random.nextInt(5); return RaftMessageType.fromByte((byte) (value + 1)); }
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 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); }
private static RaftMessageType randomMessageType(){ byte value = (byte)random.nextInt(5); return RaftMessageType.fromByte((byte) (value + 1)); }
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 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 synchronized RaftResponseMessage handleExtendedMessages(RaftRequestMessage request){ if(request.getMessageType() == RaftMessageType.AddServerRequest){ return this.handleAddServerRequest(request); }else if(request.getMessageType() == RaftMessageType.RemoveServerRequest){ return this.handleRemoveServerRequest(request); }else if(request.getMessageType() == RaftMessageType.SyncLogRequest){ return this.handleLogSyncRequest(request); }else if(request.getMessageType() == RaftMessageType.JoinClusterRequest){ return this.handleJoinClusterRequest(request); }else if(request.getMessageType() == RaftMessageType.LeaveClusterRequest){ return this.handleLeaveClusterRequest(request); }else if(request.getMessageType() == RaftMessageType.InstallSnapshotRequest){ return this.handleInstallSnapshotRequest(request); }else{ this.logger.error("receive an unknown request %s, for safety, step down.", request.getMessageType().toString()); System.exit(-1); } return null; }
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; }
response.getMessageType().toString(), response.getSource(), String.valueOf(response.isAccepted()), this.handleInstallSnapshotResponse(response); }else{ this.logger.error("Received an unexpected message %s for response, system exits.", response.getMessageType().toString()); this.stateMachine.exit(-1);
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); }
response.getMessageType().toString(), response.getSource(), String.valueOf(response.isAccepted()), this.handleInstallSnapshotResponse(response); }else{ this.logger.error("Received an unexpected message %s for response, system exits.", response.getMessageType().toString()); this.stateMachine.exit(-1);