Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Concurrency issues can occur when using this framework for websocket transfers #120

Open
chenbaoding2818 opened this issue May 10, 2024 · 4 comments · Fixed by #121
Open

Comments

@chenbaoding2818
Copy link

WARNING: DATA RACE
Read at 0x00c0004610f8 by goroutine 14:
github.com/gorilla/websocket.(*Conn).beginMessage()
/Users/vendor/github.com/gorilla/websocket/conn.go:472 +0x65
github.com/gorilla/websocket.(*Conn).WriteMessage()
/Users/vendor/github.com/gorilla/websocket/conn.go:757 +0xf9
github.com/apache/dubbo-getty.(*gettyWSConn).writePing()
/Users/vendor/github.com/apache/dubbo-getty/connection.go:627 +0x68
github.com/apache/dubbo-getty.heartbeat.func1()
/Users/vendor/github.com/apache/dubbo-getty/session.go:519 +0x6d
github.com/apache/dubbo-getty.heartbeat()
/Users/vendor/github.com/apache/dubbo-getty/session.go:533 +0x167
github.com/dubbogo/gost/time.(*TimerWheel).run()
/Users/vendor/github.com/dubbogo/gost/time/timer.go:281 +0x2b9
github.com/dubbogo/gost/time.NewTimerWheel.func1()
/Users/vendor/github.com/dubbogo/gost/time/timer.go:216 +0x4a4

Previous write at 0x00c0004610f8 by goroutine 7976:
github.com/gorilla/websocket.(*messageWriter).endMessage()
/Users/vendor/github.com/gorilla/websocket/conn.go:539 +0xcd
github.com/gorilla/websocket.(*messageWriter).flushFrame()
/Users/vendor/github.com/gorilla/websocket/conn.go:626 +0xb85
github.com/gorilla/websocket.(*Conn).WriteMessage()
/Users/vendor/github.com/gorilla/websocket/conn.go:763 +0x1d0
github.com/apache/dubbo-getty.(*gettyWSConn).send()
/Users/vendor/github.com/apache/dubbo-getty/connection.go:618 +0x117
github.com/apache/dubbo-getty.(*session).WritePkg()
/Users/vendor/github.com/apache/dubbo-getty/session.go:408 +0x3a7
server/common/net.(*Session).Write()

@chenbaoding2818
Copy link
Author

image
image
当心跳与业务同时WriteMessage方法时,会导致c.writer存在竞态问题

@AlexStocks
Copy link

Will you submit a PR to solve this problem?

@FoghostCn
Copy link

it seems like heartbeat not obtain packetLock cause the problem

dubbo-getty/session.go

Lines 513 to 538 in 6a6e1d1

func heartbeat(_ gxtime.TimerID, _ time.Time, arg interface{}) error {
ss, _ := arg.(*session)
if ss == nil || ss.IsClosed() {
return ErrSessionClosed
}
f := func() {
wsConn, wsFlag := ss.Connection.(*gettyWSConn)
if wsFlag {
err := wsConn.writePing()
if err != nil {
log.Warnf("wsConn.writePing() = error:%+v", perrors.WithStack(err))
}
}
ss.listener.OnCron(ss)
}
// if enable task pool, run @f asynchronously.
if taskPool := ss.EndPoint().GetTaskPool(); taskPool != nil {
taskPool.AddTaskAlways(f)
return nil
}
f()
return nil
}

@AlexStocks
Copy link

@chenbaoding2818 we have fixed this bug. Would you please check it by v1.4.12?

@AlexStocks AlexStocks reopened this May 31, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants