quinn icon indicating copy to clipboard operation
quinn copied to clipboard

Support all-or-nothing writes to `SendStream`

Open omegablitz opened this issue 1 year ago • 1 comments

There's currently no way in quinn_proto::SendStream (and consequently quinn::SendStream) to perform all-or-nothing writes.

As a concrete example, I have a &mut [Bytes] that I'd like to write to a quinn::SendStream in its entirety if there's sufficient send capacity, or not at all. The end-user API could look something like fn try_write_all_chunks(&mut self, bufs: &mut [Bytes]) -> Result<(), WriteError> - note that this function is not asynchronous.

The current functionality seems to be a consequence of how quinn_proto::write_source works. It currently takes in a BytesSource, acquires a lock, checks the write limit, and then writes from the BytesSource up to the limit. https://github.com/quinn-rs/quinn/blob/dcc8048974ce9b1ca6b365019149b5586ed88f4a/quinn-proto/src/connection/streams/mod.rs#L205-L243 Conceptually, this could be implemented by augmenting quinn_proto::write_source to also take in min_limit parameter.

There's probably a more flexible end-user abstraction than the try_write_all_chunks function I proposed above, but first wanted to get feedback on the idea. I'm happy to draft a PR for this if the idea seems generally useful.

omegablitz avatar Feb 07 '24 17:02 omegablitz

Can you elaborate on the use case, and cite any prior art? We've already got an awful lot of variations on "write".

Ralith avatar Feb 07 '24 19:02 Ralith

Closing this, as I think I can work around this with cwnd from Connection::stats().

omegablitz avatar Mar 21 '24 15:03 omegablitz