mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-04 12:47:36 +03:00
perform send / receive buffer increases when setting up the connection (#3949)
The UDP send and receive buffer is now increased when calling OptimizeConn.
This commit is contained in:
parent
2c4371b6a9
commit
418b866e32
4 changed files with 31 additions and 31 deletions
25
sys_conn.go
25
sys_conn.go
|
@ -2,7 +2,11 @@ package quic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -44,6 +48,27 @@ func wrapConn(pc net.PacketConn) (interface {
|
||||||
rawConn
|
rawConn
|
||||||
}, error,
|
}, error,
|
||||||
) {
|
) {
|
||||||
|
if err := setReceiveBuffer(pc); err != nil {
|
||||||
|
if !strings.Contains(err.Error(), "use of closed network connection") {
|
||||||
|
setBufferWarningOnce.Do(func() {
|
||||||
|
if disable, _ := strconv.ParseBool(os.Getenv("QUIC_GO_DISABLE_RECEIVE_BUFFER_WARNING")); disable {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("%s. See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.", err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := setSendBuffer(pc); err != nil {
|
||||||
|
if !strings.Contains(err.Error(), "use of closed network connection") {
|
||||||
|
setBufferWarningOnce.Do(func() {
|
||||||
|
if disable, _ := strconv.ParseBool(os.Getenv("QUIC_GO_DISABLE_RECEIVE_BUFFER_WARNING")); disable {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("%s. See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.", err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
conn, ok := pc.(interface {
|
conn, ok := pc.(interface {
|
||||||
SyscallConn() (syscall.RawConn, error)
|
SyscallConn() (syscall.RawConn, error)
|
||||||
})
|
})
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate sh -c "echo '// Code generated by go generate. DO NOT EDIT.\n// Source: sys_conn_buffers.go\n' > sys_conn_buffers_write.go && sed -e 's/SetReadBuffer/SetWriteBuffer/g' -e 's/setReceiveBuffer/setSendBuffer/g' -e 's/inspectReadBuffer/inspectWriteBuffer/g' -e 's/protocol\\.DesiredReceiveBufferSize/protocol\\.DesiredSendBufferSize/g' -e 's/forceSetReceiveBuffer/forceSetSendBuffer/g' -e 's/receive buffer/send buffer/g' sys_conn_buffers.go | sed '/^\\/\\/go:generate/d' >> sys_conn_buffers_write.go"
|
//go:generate sh -c "echo '// Code generated by go generate. DO NOT EDIT.\n// Source: sys_conn_buffers.go\n' > sys_conn_buffers_write.go && sed -e 's/SetReadBuffer/SetWriteBuffer/g' -e 's/setReceiveBuffer/setSendBuffer/g' -e 's/inspectReadBuffer/inspectWriteBuffer/g' -e 's/protocol\\.DesiredReceiveBufferSize/protocol\\.DesiredSendBufferSize/g' -e 's/forceSetReceiveBuffer/forceSetSendBuffer/g' -e 's/receive buffer/send buffer/g' sys_conn_buffers.go | sed '/^\\/\\/go:generate/d' >> sys_conn_buffers_write.go"
|
||||||
func setReceiveBuffer(c net.PacketConn, logger utils.Logger) error {
|
func setReceiveBuffer(c net.PacketConn) error {
|
||||||
conn, ok := c.(interface{ SetReadBuffer(int) error })
|
conn, ok := c.(interface{ SetReadBuffer(int) error })
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("connection doesn't allow setting of receive buffer size. Not a *net.UDPConn?")
|
return errors.New("connection doesn't allow setting of receive buffer size. Not a *net.UDPConn?")
|
||||||
|
@ -40,7 +40,7 @@ func setReceiveBuffer(c net.PacketConn, logger utils.Logger) error {
|
||||||
return fmt.Errorf("failed to determine receive buffer size: %w", err)
|
return fmt.Errorf("failed to determine receive buffer size: %w", err)
|
||||||
}
|
}
|
||||||
if size >= protocol.DesiredReceiveBufferSize {
|
if size >= protocol.DesiredReceiveBufferSize {
|
||||||
logger.Debugf("Conn has receive buffer of %d kiB (wanted: at least %d kiB)", size/1024, protocol.DesiredReceiveBufferSize/1024)
|
utils.DefaultLogger.Debugf("Conn has receive buffer of %d kiB (wanted: at least %d kiB)", size/1024, protocol.DesiredReceiveBufferSize/1024)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Ignore the error. We check if we succeeded by querying the buffer size afterward.
|
// Ignore the error. We check if we succeeded by querying the buffer size afterward.
|
||||||
|
@ -63,6 +63,6 @@ func setReceiveBuffer(c net.PacketConn, logger utils.Logger) error {
|
||||||
if newSize < protocol.DesiredReceiveBufferSize {
|
if newSize < protocol.DesiredReceiveBufferSize {
|
||||||
return fmt.Errorf("failed to sufficiently increase receive buffer size (was: %d kiB, wanted: %d kiB, got: %d kiB)", size/1024, protocol.DesiredReceiveBufferSize/1024, newSize/1024)
|
return fmt.Errorf("failed to sufficiently increase receive buffer size (was: %d kiB, wanted: %d kiB, got: %d kiB)", size/1024, protocol.DesiredReceiveBufferSize/1024, newSize/1024)
|
||||||
}
|
}
|
||||||
logger.Debugf("Increased receive buffer size to %d kiB", newSize/1024)
|
utils.DefaultLogger.Debugf("Increased receive buffer size to %d kiB", newSize/1024)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"github.com/quic-go/quic-go/internal/utils"
|
"github.com/quic-go/quic-go/internal/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setSendBuffer(c net.PacketConn, logger utils.Logger) error {
|
func setSendBuffer(c net.PacketConn) error {
|
||||||
conn, ok := c.(interface{ SetWriteBuffer(int) error })
|
conn, ok := c.(interface{ SetWriteBuffer(int) error })
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("connection doesn't allow setting of send buffer size. Not a *net.UDPConn?")
|
return errors.New("connection doesn't allow setting of send buffer size. Not a *net.UDPConn?")
|
||||||
|
@ -42,7 +42,7 @@ func setSendBuffer(c net.PacketConn, logger utils.Logger) error {
|
||||||
return fmt.Errorf("failed to determine send buffer size: %w", err)
|
return fmt.Errorf("failed to determine send buffer size: %w", err)
|
||||||
}
|
}
|
||||||
if size >= protocol.DesiredSendBufferSize {
|
if size >= protocol.DesiredSendBufferSize {
|
||||||
logger.Debugf("Conn has send buffer of %d kiB (wanted: at least %d kiB)", size/1024, protocol.DesiredSendBufferSize/1024)
|
utils.DefaultLogger.Debugf("Conn has send buffer of %d kiB (wanted: at least %d kiB)", size/1024, protocol.DesiredSendBufferSize/1024)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Ignore the error. We check if we succeeded by querying the buffer size afterward.
|
// Ignore the error. We check if we succeeded by querying the buffer size afterward.
|
||||||
|
@ -65,6 +65,6 @@ func setSendBuffer(c net.PacketConn, logger utils.Logger) error {
|
||||||
if newSize < protocol.DesiredSendBufferSize {
|
if newSize < protocol.DesiredSendBufferSize {
|
||||||
return fmt.Errorf("failed to sufficiently increase send buffer size (was: %d kiB, wanted: %d kiB, got: %d kiB)", size/1024, protocol.DesiredSendBufferSize/1024, newSize/1024)
|
return fmt.Errorf("failed to sufficiently increase send buffer size (was: %d kiB, wanted: %d kiB, got: %d kiB)", size/1024, protocol.DesiredSendBufferSize/1024, newSize/1024)
|
||||||
}
|
}
|
||||||
logger.Debugf("Increased send buffer size to %d kiB", newSize/1024)
|
utils.DefaultLogger.Debugf("Increased send buffer size to %d kiB", newSize/1024)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
25
transport.go
25
transport.go
|
@ -5,11 +5,7 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -302,27 +298,6 @@ func (t *Transport) listen(conn rawConn) {
|
||||||
defer close(t.listening)
|
defer close(t.listening)
|
||||||
defer getMultiplexer().RemoveConn(t.Conn)
|
defer getMultiplexer().RemoveConn(t.Conn)
|
||||||
|
|
||||||
if err := setReceiveBuffer(t.Conn, t.logger); err != nil {
|
|
||||||
if !strings.Contains(err.Error(), "use of closed network connection") {
|
|
||||||
setBufferWarningOnce.Do(func() {
|
|
||||||
if disable, _ := strconv.ParseBool(os.Getenv("QUIC_GO_DISABLE_RECEIVE_BUFFER_WARNING")); disable {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("%s. See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.", err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := setSendBuffer(t.Conn, t.logger); err != nil {
|
|
||||||
if !strings.Contains(err.Error(), "use of closed network connection") {
|
|
||||||
setBufferWarningOnce.Do(func() {
|
|
||||||
if disable, _ := strconv.ParseBool(os.Getenv("QUIC_GO_DISABLE_RECEIVE_BUFFER_WARNING")); disable {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Printf("%s. See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.", err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
p, err := conn.ReadPacket()
|
p, err := conn.ReadPacket()
|
||||||
//nolint:staticcheck // SA1019 ignore this!
|
//nolint:staticcheck // SA1019 ignore this!
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue