Unverified Commit 03651cac authored by Xin.Zh's avatar Xin.Zh Committed by GitHub

Merge pull request #68 from luoyunhe/fix

fix conn data race
parents f9499a7e 17b08dc4
...@@ -26,9 +26,7 @@ import ( ...@@ -26,9 +26,7 @@ import (
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
)
import (
"github.com/golang/snappy" "github.com/golang/snappy"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
perrors "github.com/pkg/errors" perrors "github.com/pkg/errors"
...@@ -36,9 +34,9 @@ import ( ...@@ -36,9 +34,9 @@ import (
var launchTime = time.Now() // ErrInvalidConnection = perrors.New("connection has been closed.") var launchTime = time.Now() // ErrInvalidConnection = perrors.New("connection has been closed.")
///////////////////////////////////////// // ///////////////////////////////////////
// getty connection // getty connection
///////////////////////////////////////// // ///////////////////////////////////////
var connID uint32 var connID uint32
...@@ -54,10 +52,10 @@ type gettyConn struct { ...@@ -54,10 +52,10 @@ type gettyConn struct {
active int64 // last active, in milliseconds active int64 // last active, in milliseconds
rTimeout time.Duration // network current limiting rTimeout time.Duration // network current limiting
wTimeout time.Duration wTimeout time.Duration
rLastDeadline time.Time // lastest network read time rLastDeadline int64 // lastest network read time
wLastDeadline time.Time // lastest network write time wLastDeadline int64 // lastest network write time
local string // local address local string // local address
peer string // peer address peer string // peer address
ss Session ss Session
} }
...@@ -241,12 +239,12 @@ func (t *gettyTCPConn) recv(p []byte) (int, error) { ...@@ -241,12 +239,12 @@ func (t *gettyTCPConn) recv(p []byte) (int, error) {
// of the last read deadline exceeded. // of the last read deadline exceeded.
// See https://github.com/golang/go/issues/15133 for details. // See https://github.com/golang/go/issues/15133 for details.
currentTime = time.Now() currentTime = time.Now()
if currentTime.Sub(t.rLastDeadline) > (t.rTimeout >> 2) { if currentTime.Unix()-t.rLastDeadline > int64(t.rTimeout>>2) {
if err = t.conn.SetReadDeadline(currentTime.Add(t.rTimeout)); err != nil { if err = t.conn.SetReadDeadline(currentTime.Add(t.rTimeout)); err != nil {
// just a timeout error // just a timeout error
return 0, perrors.WithStack(err) return 0, perrors.WithStack(err)
} }
t.rLastDeadline = currentTime t.rLastDeadline = currentTime.Unix()
} }
} }
...@@ -273,11 +271,11 @@ func (t *gettyTCPConn) send(pkg interface{}) (int, error) { ...@@ -273,11 +271,11 @@ func (t *gettyTCPConn) send(pkg interface{}) (int, error) {
// of the last write deadline exceeded. // of the last write deadline exceeded.
// See https://github.com/golang/go/issues/15133 for details. // See https://github.com/golang/go/issues/15133 for details.
currentTime = time.Now() currentTime = time.Now()
if currentTime.Sub(t.wLastDeadline) > (t.wTimeout >> 2) { if currentTime.Unix() - t.wLastDeadline > int64(t.wTimeout >> 2) {
if err = t.conn.SetWriteDeadline(currentTime.Add(t.wTimeout)); err != nil { if err = t.conn.SetWriteDeadline(currentTime.Add(t.wTimeout)); err != nil {
return 0, perrors.WithStack(err) return 0, perrors.WithStack(err)
} }
t.wLastDeadline = currentTime t.wLastDeadline = currentTime.Unix()
} }
} }
...@@ -329,9 +327,9 @@ func (t *gettyTCPConn) close(waitSec int) { ...@@ -329,9 +327,9 @@ func (t *gettyTCPConn) close(waitSec int) {
} }
} }
///////////////////////////////////////// // ///////////////////////////////////////
// getty udp connection // getty udp connection
///////////////////////////////////////// // ///////////////////////////////////////
type UDPContext struct { type UDPContext struct {
Pkg interface{} Pkg interface{}
...@@ -401,11 +399,11 @@ func (u *gettyUDPConn) recv(p []byte) (int, *net.UDPAddr, error) { ...@@ -401,11 +399,11 @@ func (u *gettyUDPConn) recv(p []byte) (int, *net.UDPAddr, error) {
// of the last read deadline exceeded. // of the last read deadline exceeded.
// See https://github.com/golang/go/issues/15133 for details. // See https://github.com/golang/go/issues/15133 for details.
currentTime = time.Now() currentTime = time.Now()
if currentTime.Sub(u.rLastDeadline) > (u.rTimeout >> 2) { if currentTime.Unix() - u.rLastDeadline > int64(u.rTimeout >> 2) {
if err = u.conn.SetReadDeadline(currentTime.Add(u.rTimeout)); err != nil { if err = u.conn.SetReadDeadline(currentTime.Add(u.rTimeout)); err != nil {
return 0, nil, perrors.WithStack(err) return 0, nil, perrors.WithStack(err)
} }
u.rLastDeadline = currentTime u.rLastDeadline = currentTime.Unix()
} }
} }
...@@ -449,11 +447,11 @@ func (u *gettyUDPConn) send(udpCtx interface{}) (int, error) { ...@@ -449,11 +447,11 @@ func (u *gettyUDPConn) send(udpCtx interface{}) (int, error) {
// of the last write deadline exceeded. // of the last write deadline exceeded.
// See https://github.com/golang/go/issues/15133 for details. // See https://github.com/golang/go/issues/15133 for details.
currentTime = time.Now() currentTime = time.Now()
if currentTime.Sub(u.wLastDeadline) > (u.wTimeout >> 2) { if currentTime.Unix() - u.wLastDeadline > int64(u.wTimeout >> 2) {
if err = u.conn.SetWriteDeadline(currentTime.Add(u.wTimeout)); err != nil { if err = u.conn.SetWriteDeadline(currentTime.Add(u.wTimeout)); err != nil {
return 0, perrors.WithStack(err) return 0, perrors.WithStack(err)
} }
u.wLastDeadline = currentTime u.wLastDeadline = currentTime.Unix()
} }
} }
...@@ -474,9 +472,9 @@ func (u *gettyUDPConn) close(_ int) { ...@@ -474,9 +472,9 @@ func (u *gettyUDPConn) close(_ int) {
} }
} }
///////////////////////////////////////// // ///////////////////////////////////////
// getty websocket connection // getty websocket connection
///////////////////////////////////////// // ///////////////////////////////////////
type gettyWSConn struct { type gettyWSConn struct {
gettyConn gettyConn
...@@ -575,11 +573,11 @@ func (w *gettyWSConn) updateWriteDeadline() error { ...@@ -575,11 +573,11 @@ func (w *gettyWSConn) updateWriteDeadline() error {
// of the last write deadline exceeded. // of the last write deadline exceeded.
// See https://github.com/golang/go/issues/15133 for details. // See https://github.com/golang/go/issues/15133 for details.
currentTime = time.Now() currentTime = time.Now()
if currentTime.Sub(w.wLastDeadline) > (w.wTimeout >> 2) { if currentTime.Unix() - w.wLastDeadline > int64(w.wTimeout >> 2) {
if err = w.conn.SetWriteDeadline(currentTime.Add(w.wTimeout)); err != nil { if err = w.conn.SetWriteDeadline(currentTime.Add(w.wTimeout)); err != nil {
return perrors.WithStack(err) return perrors.WithStack(err)
} }
w.wLastDeadline = currentTime w.wLastDeadline = currentTime.Unix()
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment