From 63ca0e61cf958b3823cd4b5925cab4e5a9cb6c61 Mon Sep 17 00:00:00 2001 From: Andrew Arnott Date: Wed, 8 Jul 2026 10:00:32 -0600 Subject: [PATCH] Fix PipeOptions settings This was causing a failure in our interop tests that only showed up after updating System.IO.Pipelines. --- .../MultiplexingStream.Channel.cs | 2 +- .../MultiplexingStreamV2Tests.cs | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Nerdbank.Streams/MultiplexingStream.Channel.cs b/src/Nerdbank.Streams/MultiplexingStream.Channel.cs index e593c3af..8a3dfa2f 100644 --- a/src/Nerdbank.Streams/MultiplexingStream.Channel.cs +++ b/src/Nerdbank.Streams/MultiplexingStream.Channel.cs @@ -761,7 +761,7 @@ private void InitializeOwnPipes() var writerRelay = new Pipe(); Pipe? readerRelay = this.BackpressureSupportEnabled - ? new Pipe(new PipeOptions(pauseWriterThreshold: this.localWindowSize.Value + 1)) // +1 prevents pause when remote window is exactly filled + ? new Pipe(new PipeOptions(pauseWriterThreshold: this.localWindowSize.Value + 1, resumeWriterThreshold: this.localWindowSize.Value)) // +1 prevents pause when remote window is exactly filled : new Pipe(); this.mxStreamIOReader = writerRelay.Reader; this.mxStreamIOWriter = readerRelay.Writer; diff --git a/test/Nerdbank.Streams.Tests/MultiplexingStreamV2Tests.cs b/test/Nerdbank.Streams.Tests/MultiplexingStreamV2Tests.cs index d0e6ece1..1cc6fd32 100644 --- a/test/Nerdbank.Streams.Tests/MultiplexingStreamV2Tests.cs +++ b/test/Nerdbank.Streams.Tests/MultiplexingStreamV2Tests.cs @@ -135,6 +135,29 @@ public async Task Backpressure_ExistingPipe() await writeTask; } + [Fact] + public async Task AcceptChannelAsync_SmallReceivingWindowSize() + { + const int offeredWindowSize = 16; + const int acceptedWindowSize = 64; + + Task offeredChannelTask = this.mx1.OfferChannelAsync( + "small-window", + new MultiplexingStream.ChannelOptions { ChannelReceivingWindowSize = offeredWindowSize }, + this.TimeoutToken); + Task acceptedChannelTask = this.mx2.AcceptChannelAsync( + "small-window", + new MultiplexingStream.ChannelOptions { ChannelReceivingWindowSize = acceptedWindowSize }, + this.TimeoutToken); + + MultiplexingStream.Channel[] channels = await WhenAllSucceedOrAnyFail(offeredChannelTask, acceptedChannelTask).WithCancellation(this.TimeoutToken); + + await this.TransmitAndVerifyAsync(channels[0].AsStream(), channels[1].AsStream(), new byte[] { 1, 2, 3 }); + await this.TransmitAndVerifyAsync(channels[1].AsStream(), channels[0].AsStream(), new byte[] { 4, 5, 6 }); + + await CompleteChannelsAsync(channels); + } + [Fact] public async Task Backpressure_CopyToAsync() {