mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
fix(io): ChannelRegistry 补 UnbindOutputTarget,Unregister 清理 outputTargets
outputTargets 只增不减:Unregister 一个 inputch 后,指向它的输出目标登记仍 留在表里,ResolveOutputTarget 会继续把消息路由到已不存在的 agent/inputch。 与刚修的驻留 inputch 残留同属「注册未注销」类。现补 UnbindOutputTarget (幂等),并让 Unregister 顺手清掉显式绑定与同名回退两种目标登记。
This commit is contained in:
@ -102,10 +102,20 @@ func (r *ChannelRegistry) Register(ch InputChannel) error {
|
||||
}
|
||||
|
||||
// Unregister 注销一个 inputch。
|
||||
//
|
||||
// 同时清理指向它的输出目标登记(outputTargets):否则通道被注销后,
|
||||
// ResolveOutputTarget 仍会把它解析成一个已不存在的 inputch。
|
||||
// 两种指向都要清:显式绑定到该 inputch 的,以及“回退到同名通道”的
|
||||
// (InputCh == "" 表示与输出通道同名)。
|
||||
func (r *ChannelRegistry) Unregister(name string) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
delete(r.channels, name)
|
||||
for out, t := range r.outputTargets {
|
||||
if t.InputCh == name || (t.InputCh == "" && out == name) {
|
||||
delete(r.outputTargets, out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Lookup 查询一个 inputch。
|
||||
@ -175,6 +185,18 @@ func (r *ChannelRegistry) BindOutputTarget(output, agentID, inputCh string) erro
|
||||
return nil
|
||||
}
|
||||
|
||||
// UnbindOutputTarget 取消一个输出通道的目标登记。
|
||||
//
|
||||
// 与 BindOutputTarget 成对:输出通道可能是**随资源生灭**的(如远程设备
|
||||
// 一台设备一个通道),设备掉线后必须解绑,否则 ResolveOutputTarget 会一直
|
||||
// 把消息路由到一个已不存在的 agent/inputch 上——与 inputch 登记泄漏同一类问题。
|
||||
// 未登记时是 no-op(幂等),方便清理路径无脑调用。
|
||||
func (r *ChannelRegistry) UnbindOutputTarget(output string) {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
delete(r.outputTargets, output)
|
||||
}
|
||||
|
||||
// ResolveOutputTarget 解析一个输出通道的目标;未登记时 ok=false
|
||||
// (意味着由传输层通道自行处理,如 qq/webui 这类 device 通道)。
|
||||
func (r *ChannelRegistry) ResolveOutputTarget(output string) (OutputTarget, bool) {
|
||||
|
||||
Reference in New Issue
Block a user