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 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 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()); }
final RaftRequestMessage request = rpcError.getRequest(); if(request.getMessageType() == RaftMessageType.SyncLogRequest || request.getMessageType() == RaftMessageType.JoinClusterRequest || request.getMessageType() == RaftMessageType.LeaveClusterRequest){ final PeerServer server = (request.getMessageType() == RaftMessageType.LeaveClusterRequest) ? this.peers.get(request.getDestination()) : this.serverToJoin; if(server != null){ if(server.getCurrentHeartbeatInterval() >= this.context.getRaftParameters().getMaxHeartbeatInterval()){
final RaftRequestMessage request = rpcError.getRequest(); if(request.getMessageType() == RaftMessageType.SyncLogRequest || request.getMessageType() == RaftMessageType.JoinClusterRequest || request.getMessageType() == RaftMessageType.LeaveClusterRequest){ final PeerServer server = (request.getMessageType() == RaftMessageType.LeaveClusterRequest) ? this.peers.get(request.getDestination()) : this.serverToJoin; if(server != null){ if(server.getCurrentHeartbeatInterval() >= this.context.getRaftParameters().getMaxHeartbeatInterval()){
final RaftRequestMessage request = rpcError.getRequest(); if(request.getMessageType() == RaftMessageType.SyncLogRequest || request.getMessageType() == RaftMessageType.JoinClusterRequest || request.getMessageType() == RaftMessageType.LeaveClusterRequest){ final PeerServer server = (request.getMessageType() == RaftMessageType.LeaveClusterRequest) ? this.peers.get(request.getDestination()) : this.serverToJoin; if(server != null){ if(server.getCurrentHeartbeatInterval() >= this.context.getRaftParameters().getMaxHeartbeatInterval()){