private void readStageAck(SelectionKey key) throws IOException { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer byteBuffer = readBufferMap.get(socketChannel); int value = socketChannel.read(byteBuffer); if (value < 0) { Integer slaveIndex = slave2Index.get(socketChannel); log.warn("Slave stopped! Index: " + slaveIndex + ". Remote socket is: " + socketChannel); key.cancel(); if (slaveIndex == null || slaves[slaveIndex] != socketChannel) { throw new IllegalStateException("Socket " + socketChannel + " should have been there!"); } throw new IOException("Slave stopped"); } else if (byteBuffer.position() >= 4) { int expectedSize = byteBuffer.getInt(0); if ((expectedSize + 4) > byteBuffer.capacity()) { ByteBuffer replacer = ByteBuffer.allocate(expectedSize + 4); replacer.put(byteBuffer.array(), 0, byteBuffer.position()); readBufferMap.put(socketChannel, replacer); if (log.isTraceEnabled()) log.trace( "Expected size(" + expectedSize + ")" + " is > ByteBuffer's capacity(" + byteBuffer.capacity() + ")" + ".Replacing " + byteBuffer + " with " + replacer); byteBuffer = replacer; } if (log.isTraceEnabled()) log.trace( "Expected size: " + expectedSize + ". byteBuffer.position() == " + byteBuffer.position()); if (byteBuffer.position() == expectedSize + 4) { log.trace("Received response from " + socketChannel); Object response = SerializationHelper.deserialize(byteBuffer.array(), 4, expectedSize); byteBuffer.clear(); responses.add(response); } } }