graydovee
graydovee
代码分支: master ClearConn方法会对connMgr 加锁,然后会循环调用`conn.Stop()` 在`conn.Stop()`中会调用[c.TCPServer.GetConnMgr().Remove(c)](url)来移除连接 此时调用了`connMgr.Remove()`方法,在这个方法中,会对connMgr再次加锁,最终导致死锁 下面的实例会触发死锁,无法正常关闭,zinx_v2.0, v1.0.0等分支均存在此bug ```go func main() { s := znet.NewServer() s.Start() time.Sleep(time.Second * 1) go func() { _, _ = net.Dial("tcp", "127.0.0.1:8999") }() time.Sleep(time.Second *...
之前死锁bug的修复 #131 引出的新死锁bug Router的回调会并发执行,且回调中有可能有Close connection, 与SendMsg的行为,若Close行为在SendMsg行为前发生,且SendMsg行为在finalize行为前发生,则会导致以下情况 SendMsg获取锁,尝试往msgChan发送消息,由于context已经被cancel(), StartWriter协程已被退出,不会继续消费msgChan的信息,导致SendMsg一直处于阻塞状态,此时fianlizer协程也因为锁被SendMsg方法持有,被阻塞,无法回收msgChan等资源,出现死锁 下面的测试用例有很大概率复现bug ```go type CloseConnectionBeforeSendMsgRouter struct { BaseRouter } type DemoPacket struct { DataPack } func (d *DemoPacket) Pack(msg ziface.IMessage) ([]byte, error) {...
### 系统信息 - 硬件: - 树莓派4B 8G - 存储:DS220J - 操作系统:Debian GNU/Linux 11 (bullseye) aarch64 - 部署方式:树莓派kubernetes集群 helm chart部署 - kubernetes版本:v1.19.4 - helm客户端版本:v3.9.0 - 存储:群晖NAS的NFS作为PVC挂载存储 ### 使用的哪种方式运行? Docker ### 发生了什么?...