From 585da6cfd07906ab0926bc40f0fe30ab7c8542fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=9A=E5=9B=BD=E7=8E=AE?= Date: Fri, 30 Jan 2026 02:56:27 -0800 Subject: [PATCH] =?UTF-8?q?fix(cluster):=20=E4=BF=AE=E5=A4=8D=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E9=87=8D=E5=90=AF=E6=97=B6=20WaitGroup=20=E8=B4=9F?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E5=99=A8=20panic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 Proxy 中添加 boundUsers 跟踪已绑定用户,确保 BindNode/UnbindNode 中的 addWait/doneWait 调用严格配对,避免重复绑定或未绑定时解绑导致计数器不匹配 --- cluster/node/proxy.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cluster/node/proxy.go b/cluster/node/proxy.go index 9379aeca..bc23b781 100644 --- a/cluster/node/proxy.go +++ b/cluster/node/proxy.go @@ -2,6 +2,7 @@ package node import ( "context" + "sync" "time" "github.com/dobyte/due/v2/cluster" @@ -17,6 +18,7 @@ type Proxy struct { node *Node // 节点服务器 gateLinker *link.GateLinker // 网关链接器 nodeLinker *link.NodeLinker // 节点链接器 + boundUsers sync.Map // 跟踪已绑定用户 } func newProxy(node *Node) *Proxy { @@ -174,7 +176,9 @@ func (p *Proxy) BindNode(ctx context.Context, uid int64, nameAndNID ...string) e } if nid == p.node.opts.id { - p.node.addWait() + if _, loaded := p.boundUsers.LoadOrStore(uid, struct{}{}); !loaded { + p.node.addWait() + } } return nil @@ -195,7 +199,9 @@ func (p *Proxy) UnbindNode(ctx context.Context, uid int64, nameAndNID ...string) } if nid == p.node.opts.id { - p.node.doneWait() + if _, loaded := p.boundUsers.LoadAndDelete(uid); loaded { + p.node.doneWait() + } } return nil