【HDFS】Hadoop RPC是如何知道请求头和数据长度的?

org.apache.hadoop.ipc.Server.Connection#readAndProcess:

下面这段代码读取出RPC Header + RPC请求体的长度。读到一个int型整数dataLength里。

        if (data == null) { // just read 4 bytes -  length of RPC packet
          dataLengthBuffer.flip();
          dataLength = dataLengthBuffer.getInt();
          checkDataLength(dataLength);
          // Set buffer for reading EXACTLY the RPC-packet length and no more.
          data = ByteBuffer.allocate(dataLength);
        }

但是在观察客户端的代码时候,并没有很明显的写一个总长度的逻辑。很好奇是怎么实现的。于是研究了一下这里的源码。

找线索的源头肯定要到客户端侧发送Rpc请求的地方去找。

org.apache.hadoop.ipc.Client.Connection#sendRpcRequest方法就是客户端向服务端发送Rpc请求的函数。参数是一个Call对象。

关注这个方法里的几行注释,一个请求在网络中传输的格式:

  1. 1和2的长度
  2. RpcRequestHeader
  3. RpcRequest

你可能感兴趣的:(【HDFS】Hadoop RPC是如何知道请求头和数据长度的?)