substream: Decrement the bytes counter to avoid excessive flushing#511
Merged
substream: Decrement the bytes counter to avoid excessive flushing#511
Conversation
calls Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
dmitry-markin
approved these changes
Jan 15, 2026
Comment on lines
+680
to
+688
| // This attempts to empty 'pending_out_frames' into the socket. | ||
| match futures::Sink::poll_flush(self.as_mut(), cx) { | ||
| Poll::Ready(Ok(())) => {} | ||
| Poll::Ready(Err(e)) => return Poll::Ready(Err(e)), | ||
| Poll::Pending => { | ||
| // Still flushing. We cannot accept new data yet. | ||
| return Poll::Pending; | ||
| } | ||
| } |
Collaborator
There was a problem hiding this comment.
How is this different from poll_flush!?
Collaborator
Author
There was a problem hiding this comment.
The poll_flush! should call into the socket / TCP under the hood via AsyncWrite::poll_flush.
By calling the futures::Sink::poll_flush we ensure our impl is always called and try to write any pending frames before calling poll_flush
dmitry-markin
added a commit
that referenced
this pull request
Jan 21, 2026
## [0.13.0] - 2026-01-21 This release brings multiple fixes to both the transport and application-level protocols. Specifically, it enhances WebSocket stability by resolving AsyncWrite errors and ensuring that partial writes during the negotiation phase no longer trigger connection failures. At the same time, Bitswap client functionality is introduced, which makes this release semver breaking. ### Added - Add Bitswap client ([#501](#501)) ### Fixed - notif/fix: Avoid CPU busy loops on litep2p full shutdown ([#521](#521)) - protocol: Ensure transport manager knows about closed connections ([#515](#515)) - substream: Decrement the bytes counter to avoid excessive flushing ([#511](#511)) - crypto/noise: Improve stability of websockets by fixing AsyncWrite implementation ([#518](#518)) - bitswap: Split block responses into batches under 2 MiB ([#516](#516)) - crypto/noise: Fix connection negotiation logic on partial writes ([#519](#519)) - substream/fix: Fix partial reads for ProtocolCodec::Identity ([#512](#512)) - webrtc: Avoid panics returning error instead ([#509](#509)) - bitswap: e2e test & max payload fix ([#508](#508)) - tcp: Exit connections when events fail to propagate to protocols ([#506](#506)) - webrtc: Avoid future being dropped when channel is full ([#483](#483)) --------- Co-authored-by: Alexandru Vasile <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The substream implementation utilises a
pending_out_bytescounter to enforce backpressure via flushing once the buffer fills up to 64KiB.poll_readyto make a syscall to flush the socket at every callThis implementation decrements the counter when data is moved to the socket. This should optimize the
poll_readyfn for long lived substreams.While at it, the
poll_readyimplementation calls into theSink::poll_flushwhich also drains the pending frames.