make the initial connection flow control window configurable

This commit is contained in:
Marten Seemann 2021-03-10 15:04:38 +08:00
parent d9434f523e
commit a15cfd6871
5 changed files with 18 additions and 5 deletions

View file

@ -79,6 +79,10 @@ func populateConfig(config *Config) *Config {
if maxReceiveStreamFlowControlWindow == 0 { if maxReceiveStreamFlowControlWindow == 0 {
maxReceiveStreamFlowControlWindow = protocol.DefaultMaxReceiveStreamFlowControlWindow maxReceiveStreamFlowControlWindow = protocol.DefaultMaxReceiveStreamFlowControlWindow
} }
initialConnectionFlowControlWindow := config.InitialConnectionFlowControlWindow
if initialConnectionFlowControlWindow == 0 {
initialConnectionFlowControlWindow = protocol.DefaultInitialMaxData
}
maxReceiveConnectionFlowControlWindow := config.MaxReceiveConnectionFlowControlWindow maxReceiveConnectionFlowControlWindow := config.MaxReceiveConnectionFlowControlWindow
if maxReceiveConnectionFlowControlWindow == 0 { if maxReceiveConnectionFlowControlWindow == 0 {
maxReceiveConnectionFlowControlWindow = protocol.DefaultMaxReceiveConnectionFlowControlWindow maxReceiveConnectionFlowControlWindow = protocol.DefaultMaxReceiveConnectionFlowControlWindow
@ -104,6 +108,7 @@ func populateConfig(config *Config) *Config {
KeepAlive: config.KeepAlive, KeepAlive: config.KeepAlive,
InitialStreamFlowControlWindow: initialStreamFlowControlWindow, InitialStreamFlowControlWindow: initialStreamFlowControlWindow,
MaxReceiveStreamFlowControlWindow: maxReceiveStreamFlowControlWindow, MaxReceiveStreamFlowControlWindow: maxReceiveStreamFlowControlWindow,
InitialConnectionFlowControlWindow: initialConnectionFlowControlWindow,
MaxReceiveConnectionFlowControlWindow: maxReceiveConnectionFlowControlWindow, MaxReceiveConnectionFlowControlWindow: maxReceiveConnectionFlowControlWindow,
MaxIncomingStreams: maxIncomingStreams, MaxIncomingStreams: maxIncomingStreams,
MaxIncomingUniStreams: maxIncomingUniStreams, MaxIncomingUniStreams: maxIncomingUniStreams,

View file

@ -61,6 +61,8 @@ var _ = Describe("Config", func() {
f.Set(reflect.ValueOf(uint64(1234))) f.Set(reflect.ValueOf(uint64(1234)))
case "MaxReceiveStreamFlowControlWindow": case "MaxReceiveStreamFlowControlWindow":
f.Set(reflect.ValueOf(uint64(9))) f.Set(reflect.ValueOf(uint64(9)))
case "InitialConnectionFlowControlWindow":
f.Set(reflect.ValueOf(uint64(4321)))
case "MaxReceiveConnectionFlowControlWindow": case "MaxReceiveConnectionFlowControlWindow":
f.Set(reflect.ValueOf(uint64(10))) f.Set(reflect.ValueOf(uint64(10)))
case "MaxIncomingStreams": case "MaxIncomingStreams":
@ -146,6 +148,7 @@ var _ = Describe("Config", func() {
Expect(c.HandshakeIdleTimeout).To(Equal(protocol.DefaultHandshakeIdleTimeout)) Expect(c.HandshakeIdleTimeout).To(Equal(protocol.DefaultHandshakeIdleTimeout))
Expect(c.InitialStreamFlowControlWindow).To(BeEquivalentTo(protocol.DefaultInitialMaxStreamData)) Expect(c.InitialStreamFlowControlWindow).To(BeEquivalentTo(protocol.DefaultInitialMaxStreamData))
Expect(c.MaxReceiveStreamFlowControlWindow).To(BeEquivalentTo(protocol.DefaultMaxReceiveStreamFlowControlWindow)) Expect(c.MaxReceiveStreamFlowControlWindow).To(BeEquivalentTo(protocol.DefaultMaxReceiveStreamFlowControlWindow))
Expect(c.InitialConnectionFlowControlWindow).To(BeEquivalentTo(protocol.DefaultInitialMaxData))
Expect(c.MaxReceiveConnectionFlowControlWindow).To(BeEquivalentTo(protocol.DefaultMaxReceiveConnectionFlowControlWindow)) Expect(c.MaxReceiveConnectionFlowControlWindow).To(BeEquivalentTo(protocol.DefaultMaxReceiveConnectionFlowControlWindow))
Expect(c.MaxIncomingStreams).To(BeEquivalentTo(protocol.DefaultMaxIncomingStreams)) Expect(c.MaxIncomingStreams).To(BeEquivalentTo(protocol.DefaultMaxIncomingStreams))
Expect(c.MaxIncomingUniStreams).To(BeEquivalentTo(protocol.DefaultMaxIncomingUniStreams)) Expect(c.MaxIncomingUniStreams).To(BeEquivalentTo(protocol.DefaultMaxIncomingUniStreams))

View file

@ -253,6 +253,11 @@ type Config struct {
// MaxReceiveStreamFlowControlWindow is the maximum stream-level flow control window for receiving data. // MaxReceiveStreamFlowControlWindow is the maximum stream-level flow control window for receiving data.
// If this value is zero, it will default to 6 MB. // If this value is zero, it will default to 6 MB.
MaxReceiveStreamFlowControlWindow uint64 MaxReceiveStreamFlowControlWindow uint64
// InitialConnectionFlowControlWindow is the initial size of the stream-level flow control window for receiving data.
// If the application is consuming data quickly enough, the flow control auto-tuning algorithm
// will increase the window up to MaxReceiveConnectionFlowControlWindow.
// If this value is zero, it will default to 512 KB.
InitialConnectionFlowControlWindow uint64
// MaxReceiveConnectionFlowControlWindow is the connection-level flow control window for receiving data. // MaxReceiveConnectionFlowControlWindow is the connection-level flow control window for receiving data.
// If this value is zero, it will default to 15 MB. // If this value is zero, it will default to 15 MB.
MaxReceiveConnectionFlowControlWindow uint64 MaxReceiveConnectionFlowControlWindow uint64

View file

@ -24,8 +24,8 @@ const ConnectionFlowControlMultiplier = 1.5
// DefaultInitialMaxStreamData is the default initial stream-level flow control window for receiving data // DefaultInitialMaxStreamData is the default initial stream-level flow control window for receiving data
const DefaultInitialMaxStreamData = (1 << 10) * 512 // 512 kb const DefaultInitialMaxStreamData = (1 << 10) * 512 // 512 kb
// InitialMaxData is the connection-level flow control window for receiving data // DefaultInitialMaxData is the connection-level flow control window for receiving data
const InitialMaxData = ConnectionFlowControlMultiplier * DefaultInitialMaxStreamData const DefaultInitialMaxData = ConnectionFlowControlMultiplier * DefaultInitialMaxStreamData
// DefaultMaxReceiveStreamFlowControlWindow is the default maximum stream-level flow control window for receiving data // DefaultMaxReceiveStreamFlowControlWindow is the default maximum stream-level flow control window for receiving data
const DefaultMaxReceiveStreamFlowControlWindow = 6 * (1 << 20) // 6 MB const DefaultMaxReceiveStreamFlowControlWindow = 6 * (1 << 20) // 6 MB

View file

@ -286,7 +286,7 @@ var newSession = func(
InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamFlowControlWindow), InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamFlowControlWindow),
InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamFlowControlWindow), InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamFlowControlWindow),
InitialMaxStreamDataUni: protocol.ByteCount(s.config.InitialStreamFlowControlWindow), InitialMaxStreamDataUni: protocol.ByteCount(s.config.InitialStreamFlowControlWindow),
InitialMaxData: protocol.InitialMaxData, InitialMaxData: protocol.ByteCount(s.config.InitialConnectionFlowControlWindow),
MaxIdleTimeout: s.config.MaxIdleTimeout, MaxIdleTimeout: s.config.MaxIdleTimeout,
MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams), MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams),
MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams), MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams),
@ -410,7 +410,7 @@ var newClientSession = func(
InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamFlowControlWindow), InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamFlowControlWindow),
InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamFlowControlWindow), InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamFlowControlWindow),
InitialMaxStreamDataUni: protocol.ByteCount(s.config.InitialStreamFlowControlWindow), InitialMaxStreamDataUni: protocol.ByteCount(s.config.InitialStreamFlowControlWindow),
InitialMaxData: protocol.InitialMaxData, InitialMaxData: protocol.ByteCount(s.config.InitialConnectionFlowControlWindow),
MaxIdleTimeout: s.config.MaxIdleTimeout, MaxIdleTimeout: s.config.MaxIdleTimeout,
MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams), MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams),
MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams), MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams),
@ -484,7 +484,7 @@ func (s *session) preSetup() {
s.frameParser = wire.NewFrameParser(s.config.EnableDatagrams, s.version) s.frameParser = wire.NewFrameParser(s.config.EnableDatagrams, s.version)
s.rttStats = &utils.RTTStats{} s.rttStats = &utils.RTTStats{}
s.connFlowController = flowcontrol.NewConnectionFlowController( s.connFlowController = flowcontrol.NewConnectionFlowController(
protocol.InitialMaxData, protocol.ByteCount(s.config.InitialConnectionFlowControlWindow),
protocol.ByteCount(s.config.MaxReceiveConnectionFlowControlWindow), protocol.ByteCount(s.config.MaxReceiveConnectionFlowControlWindow),
s.onHasConnectionWindowUpdate, s.onHasConnectionWindowUpdate,
s.rttStats, s.rttStats,