Example #1
0
  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);
      }
    }
  }