From 1f01b7111782f1bc62ddef93ad1231d423d752f2 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 22 Oct 2021 22:31:28 +0800 Subject: [PATCH 1/3] Opt: change timeout to atomic --- connection.go | 76 +++++++++++++++++++++++++-------------------------- go.mod | 2 +- go.sum | 3 +- 3 files changed, 41 insertions(+), 40 deletions(-) diff --git a/connection.go b/connection.go index d0c12c1e..e1371ccf 100644 --- a/connection.go +++ b/connection.go @@ -82,10 +82,10 @@ type gettyConn struct { readPkgNum uatomic.Uint32 // send pkg number writePkgNum uatomic.Uint32 // recv pkg number active uatomic.Int64 // last active, in milliseconds - rTimeout time.Duration // network current limiting - wTimeout time.Duration - rLastDeadline time.Time // last network read time - wLastDeadline time.Time // last network write time + rTimeout uatomic.Duration // network current limiting + wTimeout uatomic.Duration + rLastDeadline uatomic.Time // last network read time + wLastDeadline uatomic.Time // last network write time local string // local address peer string // peer address ss Session @@ -126,7 +126,7 @@ func (c *gettyConn) send(interface{}) (int, error) { func (c *gettyConn) close(int) {} func (c gettyConn) readTimeout() time.Duration { - return c.rTimeout + return c.rTimeout.Load() } func (c *gettyConn) setSession(ss Session) { @@ -142,14 +142,14 @@ func (c *gettyConn) SetReadTimeout(rTimeout time.Duration) { panic("@rTimeout < 1") } - c.rTimeout = rTimeout - if c.wTimeout == 0 { - c.wTimeout = rTimeout + c.rTimeout.Store(rTimeout) + if c.wTimeout.Load() == 0 { + c.wTimeout.Store(rTimeout) } } func (c gettyConn) writeTimeout() time.Duration { - return c.wTimeout + return c.wTimeout.Load() } // SetWriteTimeout Pls do not set write deadline for websocket connection. AlexStocks 20180310 @@ -161,9 +161,9 @@ func (c *gettyConn) SetWriteTimeout(wTimeout time.Duration) { panic("@wTimeout < 1") } - c.wTimeout = wTimeout - if c.rTimeout == 0 { - c.rTimeout = wTimeout + c.wTimeout.Store(wTimeout) + if c.rTimeout.Load() == 0 { + c.rTimeout.Store(wTimeout) } } @@ -198,8 +198,8 @@ func newGettyTCPConn(conn net.Conn) *gettyTCPConn { writer: io.Writer(conn), gettyConn: gettyConn{ id: connID.Add(1), - rTimeout: netIOTimeout, - wTimeout: netIOTimeout, + rTimeout: *uatomic.NewDuration(netIOTimeout), + wTimeout: *uatomic.NewDuration(netIOTimeout), local: localAddr, peer: peerAddr, compress: CompressNone, @@ -266,17 +266,17 @@ func (t *gettyTCPConn) recv(p []byte) (int, error) { ) // set read timeout deadline - if t.compress == CompressNone && t.rTimeout > 0 { + if t.compress == CompressNone && t.rTimeout.Load() > 0 { // Optimization: update read deadline only if more than 25% // of the last read deadline exceeded. // See https://github.com/golang/go/issues/15133 for details. currentTime = time.Now() - if currentTime.Sub(t.rLastDeadline) > t.rTimeout>>2 { - if err = t.conn.SetReadDeadline(currentTime.Add(t.rTimeout)); err != nil { + if currentTime.Sub(t.rLastDeadline.Load()) > t.rTimeout.Load()>>2 { + if err = t.conn.SetReadDeadline(currentTime.Add(t.rTimeout.Load())); err != nil { // just a timeout error return 0, perrors.WithStack(err) } - t.rLastDeadline = currentTime + t.rLastDeadline.Store(currentTime) } } @@ -296,16 +296,16 @@ func (t *gettyTCPConn) send(pkg interface{}) (int, error) { lg int64 ) - if t.compress == CompressNone && t.wTimeout > 0 { + if t.compress == CompressNone && t.wTimeout.Load() > 0 { // Optimization: update write deadline only if more than 25% // of the last write deadline exceeded. // See https://github.com/golang/go/issues/15133 for details. currentTime = time.Now() - if currentTime.Sub(t.wLastDeadline) > t.wTimeout>>2 { - if err = t.conn.SetWriteDeadline(currentTime.Add(t.wTimeout)); err != nil { + if currentTime.Sub(t.wLastDeadline.Load()) > t.wTimeout.Load()>>2 { + if err = t.conn.SetWriteDeadline(currentTime.Add(t.wTimeout.Load())); err != nil { return 0, perrors.WithStack(err) } - t.wLastDeadline = currentTime + t.wLastDeadline.Store(currentTime) } } @@ -396,8 +396,8 @@ func newGettyUDPConn(conn *net.UDPConn) *gettyUDPConn { conn: conn, gettyConn: gettyConn{ id: connID.Add(1), - rTimeout: netIOTimeout, - wTimeout: netIOTimeout, + rTimeout: *uatomic.NewDuration(netIOTimeout), + wTimeout: *uatomic.NewDuration(netIOTimeout), local: localAddr, peer: peerAddr, compress: CompressNone, @@ -417,16 +417,16 @@ func (u *gettyUDPConn) SetCompressType(c CompressType) { // udp connection read func (u *gettyUDPConn) recv(p []byte) (int, *net.UDPAddr, error) { - if u.rTimeout > 0 { + if u.rTimeout.Load() > 0 { // Optimization: update read deadline only if more than 25% // of the last read deadline exceeded. // See https://github.com/golang/go/issues/15133 for details. currentTime := time.Now() - if currentTime.Sub(u.rLastDeadline) > u.rTimeout>>2 { - if err := u.conn.SetReadDeadline(currentTime.Add(u.rTimeout)); err != nil { + if currentTime.Sub(u.rLastDeadline.Load()) > u.rTimeout.Load()>>2 { + if err := u.conn.SetReadDeadline(currentTime.Add(u.rTimeout.Load())); err != nil { return 0, nil, perrors.WithStack(err) } - u.rLastDeadline = currentTime + u.rLastDeadline.Store(currentTime) } } @@ -464,16 +464,16 @@ func (u *gettyUDPConn) send(udpCtx interface{}) (int, error) { } } - if u.wTimeout > 0 { + if u.wTimeout.Load() > 0 { // Optimization: update write deadline only if more than 25% // of the last write deadline exceeded. // See https://github.com/golang/go/issues/15133 for details. currentTime = time.Now() - if currentTime.Sub(u.wLastDeadline) > u.wTimeout>>2 { - if err = u.conn.SetWriteDeadline(currentTime.Add(u.wTimeout)); err != nil { + if currentTime.Sub(u.wLastDeadline.Load()) > u.wTimeout.Load()>>2 { + if err = u.conn.SetWriteDeadline(currentTime.Add(u.wTimeout.Load())); err != nil { return 0, perrors.WithStack(err) } - u.wLastDeadline = currentTime + u.wLastDeadline.Store(currentTime) } } @@ -521,8 +521,8 @@ func newGettyWSConn(conn *websocket.Conn) *gettyWSConn { conn: conn, gettyConn: gettyConn{ id: connID.Add(1), - rTimeout: netIOTimeout, - wTimeout: netIOTimeout, + rTimeout: *uatomic.NewDuration(netIOTimeout), + wTimeout: *uatomic.NewDuration(netIOTimeout), local: localAddr, peer: peerAddr, compress: CompressNone, @@ -589,16 +589,16 @@ func (w *gettyWSConn) updateWriteDeadline() error { currentTime time.Time ) - if w.wTimeout > 0 { + if w.wTimeout.Load() > 0 { // Optimization: update write deadline only if more than 25% // of the last write deadline exceeded. // See https://github.com/golang/go/issues/15133 for details. currentTime = time.Now() - if currentTime.Sub(w.wLastDeadline) > w.wTimeout>>2 { - if err = w.conn.SetWriteDeadline(currentTime.Add(w.wTimeout)); err != nil { + if currentTime.Sub(w.wLastDeadline.Load()) > w.wTimeout.Load()>>2 { + if err = w.conn.SetWriteDeadline(currentTime.Add(w.wTimeout.Load())); err != nil { return perrors.WithStack(err) } - w.wLastDeadline = currentTime + w.wLastDeadline.Store(currentTime) } } diff --git a/go.mod b/go.mod index 8b24c743..ae6443a3 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,6 @@ require ( github.com/montanaflynn/stats v0.6.6 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.7.0 - go.uber.org/atomic v1.7.0 + go.uber.org/atomic v1.9.0 go.uber.org/zap v1.16.0 ) diff --git a/go.sum b/go.sum index e8ed596f..86180fba 100644 --- a/go.sum +++ b/go.sum @@ -413,8 +413,9 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= From 9be0aeebaacc081fd5786d27a7de3511c86622f5 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 22 Oct 2021 23:08:11 +0800 Subject: [PATCH 2/3] fix license --- connection.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/connection.go b/connection.go index e1371ccf..9ad26b11 100644 --- a/connection.go +++ b/connection.go @@ -29,11 +29,8 @@ import ( import ( "github.com/golang/snappy" - "github.com/gorilla/websocket" - perrors "github.com/pkg/errors" - uatomic "go.uber.org/atomic" ) From 04c5bef7cb67750355800f683727561934c0261e Mon Sep 17 00:00:00 2001 From: jason Date: Sun, 24 Oct 2021 22:08:54 +0800 Subject: [PATCH 3/3] gofumpt connection --- connection.go | 14 +++++++------- go.sum | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/connection.go b/connection.go index 9ad26b11..8ad9f6c1 100644 --- a/connection.go +++ b/connection.go @@ -74,17 +74,17 @@ type gettyConn struct { compress CompressType padding1 uint8 padding2 uint16 - readBytes uatomic.Uint32 // read bytes - writeBytes uatomic.Uint32 // write bytes - readPkgNum uatomic.Uint32 // send pkg number - writePkgNum uatomic.Uint32 // recv pkg number - active uatomic.Int64 // last active, in milliseconds + readBytes uatomic.Uint32 // read bytes + writeBytes uatomic.Uint32 // write bytes + readPkgNum uatomic.Uint32 // send pkg number + writePkgNum uatomic.Uint32 // recv pkg number + active uatomic.Int64 // last active, in milliseconds rTimeout uatomic.Duration // network current limiting wTimeout uatomic.Duration rLastDeadline uatomic.Time // last network read time wLastDeadline uatomic.Time // last network write time - local string // local address - peer string // peer address + local string // local address + peer string // peer address ss Session } diff --git a/go.sum b/go.sum index 86180fba..6ab731d3 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,8 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/dubbogo/go-zookeeper v1.0.3/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c= github.com/dubbogo/gost v1.11.12 h1:e3861DxHWe509whpMxS6mFBmgmm7r9+bT5iJ/PRufcw= github.com/dubbogo/gost v1.11.12/go.mod h1:vIcP9rqz2KsXHPjsAwIUtfJIJjppQLQDcYaZTy/61jI= +github.com/dubbogo/gost v1.11.19 h1:R1rZ3TNJKV9W5XHLMv+GDO2Wy6UDnwGQtVWbsWYvo0A= +github.com/dubbogo/gost v1.11.19/go.mod h1:vIcP9rqz2KsXHPjsAwIUtfJIJjppQLQDcYaZTy/61jI= github.com/dubbogo/jsonparser v1.0.1/go.mod h1:tYAtpctvSP/tWw4MeelsowSPgXQRVHHWbqL6ynps8jU= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=