Broker's Selector currently reads all requests available on the socket when the socket is ready for read. These are queued up as staged receives. We mute the channel and stop reading any more data until all the staged requests are processed. This behaviour is slightly inconsistent since for the initial read we drain the socket buffer, allowing it to get filled up again, but if data arrives slighly after the initial read, then we dont read from the socket buffer until pending requests are processed.
To avoid holding onto requests for longer than required, we should read one request at a time even if more data is available in the socket buffer. This is especially useful for produce requests which may be large and may take long to process.
Note that with the default socket read buffer size of 100K, this is not a critical issue. But with larger socket buffers, this could result in excessive memory usage if a lot of produce requests are buffered in the broker and the producer times out, reconnects and sends more data before broker has cleared older requests. By reading one-at-a-time, we reduce the amount of time the broker holds onto memory for each request.