forked from quic-go/quic-go
flowcontrol: fix start of the flow-control auto-tuning period (#4730)
The period should start when the first frame is received, not when the data is first read. This makes a difference when the first STREAM frame is received out of order.
This commit is contained in:
@@ -66,11 +66,6 @@ func (c *baseFlowController) sendWindowSize() protocol.ByteCount {
|
|||||||
|
|
||||||
// needs to be called with locked mutex
|
// needs to be called with locked mutex
|
||||||
func (c *baseFlowController) addBytesRead(n protocol.ByteCount) {
|
func (c *baseFlowController) addBytesRead(n protocol.ByteCount) {
|
||||||
// pretend we sent a WindowUpdate when reading the first byte
|
|
||||||
// this way auto-tuning of the window size already works for the first WindowUpdate
|
|
||||||
if c.bytesRead == 0 {
|
|
||||||
c.startNewAutoTuningEpoch(time.Now())
|
|
||||||
}
|
|
||||||
c.bytesRead += n
|
c.bytesRead += n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,12 @@ func (c *connectionFlowController) IncrementHighestReceived(increment protocol.B
|
|||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
defer c.mutex.Unlock()
|
defer c.mutex.Unlock()
|
||||||
|
|
||||||
|
// If this is the first frame received on this connection, start flow-control auto-tuning.
|
||||||
|
if c.highestReceived == 0 {
|
||||||
|
c.startNewAutoTuningEpoch(time.Now())
|
||||||
|
}
|
||||||
c.highestReceived += increment
|
c.highestReceived += increment
|
||||||
|
|
||||||
if c.checkFlowControlViolation() {
|
if c.checkFlowControlViolation() {
|
||||||
return &qerr.TransportError{
|
return &qerr.TransportError{
|
||||||
ErrorCode: qerr.FlowControlError,
|
ErrorCode: qerr.FlowControlError,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package flowcontrol
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/quic-go/quic-go/internal/protocol"
|
"github.com/quic-go/quic-go/internal/protocol"
|
||||||
"github.com/quic-go/quic-go/internal/qerr"
|
"github.com/quic-go/quic-go/internal/qerr"
|
||||||
@@ -70,8 +71,7 @@ func (c *streamFlowController) UpdateHighestReceived(offset protocol.ByteCount,
|
|||||||
if offset == c.highestReceived {
|
if offset == c.highestReceived {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// A higher offset was received before.
|
// A higher offset was received before. This can happen due to reordering.
|
||||||
// This can happen due to reordering.
|
|
||||||
if offset <= c.highestReceived {
|
if offset <= c.highestReceived {
|
||||||
if final {
|
if final {
|
||||||
return &qerr.TransportError{
|
return &qerr.TransportError{
|
||||||
@@ -82,8 +82,13 @@ func (c *streamFlowController) UpdateHighestReceived(offset protocol.ByteCount,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If this is the first frame received for this stream, start flow-control auto-tuning.
|
||||||
|
if c.highestReceived == 0 {
|
||||||
|
c.startNewAutoTuningEpoch(time.Now())
|
||||||
|
}
|
||||||
increment := offset - c.highestReceived
|
increment := offset - c.highestReceived
|
||||||
c.highestReceived = offset
|
c.highestReceived = offset
|
||||||
|
|
||||||
if c.checkFlowControlViolation() {
|
if c.checkFlowControlViolation() {
|
||||||
return &qerr.TransportError{
|
return &qerr.TransportError{
|
||||||
ErrorCode: qerr.FlowControlError,
|
ErrorCode: qerr.FlowControlError,
|
||||||
|
|||||||
Reference in New Issue
Block a user