Handle large ranges on a separate stream
TL;DR;
If the customer requests a "large" range, or if there are "too many" requests in the current ObjectDescriptor then the library should use a separate streaming RPC to service the request.
The definition of "large" and "too many" should be configurable by the customer, but something like "anything more than 128 MiB" is probably too large. And "more than 100 requests" is too many, or "if the requests total more than 128 MiB" is probably "too many" too.
Background
We expect 20-30 open range requests in any given ObjectDescriptor, and we expect each of these to be a few MiB. We should be prepared for exceptional cases. The approach we will take is to create a separate RPC for anything that is too large, or too large including already pending requests, or if there are already too many requests.
There is no need to optimize this case: do not attempt to coalesce these ranged reads into a single RPC, or to reuse previous RPCs. These are exceptional cases, we need the library to work, but not to be optimized.