quic: don't block Writes on stream-level flow control
Data written to a stream can be sent to the peer in a STREAM
frame only when:
- congestion control window is available
- pacing does not block sending
- stream-level flow control is available
- connection-level flow control is available
There must be a pushback mechanism to limit the amount of
locally buffered stream data, but I no longer believe the
stream-level flow control needs to be part of that pushback.
Using connection-level flow control (not yet implemented)
to block stream Write calls is problematic, because it
makes it difficult to fairly divide available send capacity
between multiple streams. If writes to a stream consume
connection-level flow control before we commit that
data to the wire, it becomes very easy for one stream to
starve others.
It's confusing to use stream-level flow control to block
Write calls, but not connection-level flow control.
This will especially produce unexpected behavior
if the recipient chooses to provide unlimited stream-level
quota but limited connection-level quota.
Change Stream.Write to only block writes based on the
configured maximum send buffer size. We may now buffer data
which cannot be immediately sent, but that was the case already
when transmission is blocked by congestion control.
In the future, we may want to make the stream buffer sizes
adaptive in response to the amount of in-flight data.
Rename Config.Stream*BufferSize to MaxStream*BufferSize,
to allow for possibly adding a minimum size later.
For golang/go#58547
Change-Id: I528a611fefb16b323776965c5b2ab5644035ed7a
Reviewed-on: https://go-review.googlesource.com/c/net/+/524958
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: Damien Neil <dneil@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/internal/quic/config_test.go b/internal/quic/config_test.go
index 8d67ef0..b99ffef 100644
--- a/internal/quic/config_test.go
+++ b/internal/quic/config_test.go
@@ -17,7 +17,7 @@
tc := newTestConn(t, clientSide, func(c *Config) {
c.MaxBidiRemoteStreams = wantInitialMaxStreamsBidi
c.MaxUniRemoteStreams = wantInitialMaxStreamsUni
- c.StreamReadBufferSize = wantInitialMaxStreamData
+ c.MaxStreamReadBufferSize = wantInitialMaxStreamData
})
tc.handshake()
if tc.sentTransportParameters == nil {