mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-03 15:53:56 +00:00
fix(resident): 销毁驻留子时注销其入站 inputch(child/<id>)—— 修登记表脏数据累积
根因:residentInboundChannel 在 create 时把 child/<id> 登记进共享登记表 (Plugin=resident, Owner=父),但 teardownResident 只把划入的 inputch (如 timer)归还为未分配,从未注销这条入站登记。于是每次 create/destroy 都在登记表里留下一条脏记录,且随次数单调累积。 实测(HomeAgent 侧,HΔ-Kernel v1.3.10 / 0ad3e6d): resident_agents destroy 之后,input_channels by_agent 仍列出 child/<id>, 归属 main;而 HomeAgent 没有任何工具能单独注销 inputch,只能重启 homed 清。 修法:teardownResident 里用纯函数 inboundChannelName 算出名字并 Unregister。 不能复用 residentInboundChannel——它有重新登记的副作用。 该路径同时覆盖 destroy / reclaim / StopResidents(父退出)。 测试:TestResident_LifecycleAndNoOrphans 增加两条断言——销毁后与父退出后 child/<id> 都必须从登记表消失。
This commit is contained in:
@ -142,6 +142,11 @@ func TestResident_LifecycleAndNoOrphans(t *testing.T) {
|
||||
if ch, _ := reg.Lookup("sub/in"); ch.Owner != "" {
|
||||
t.Fatalf("销毁后 inputch 应回到未分配:%+v", ch)
|
||||
}
|
||||
// 父的入站 inputch(child/<id>)必须在销毁时一并注销,否则登记表残留脏数据——
|
||||
// HomeAgent 实测:destroy 后 child/<id> 仍挂在根 agent 名下,且无工具可单独注销。
|
||||
if inbound, ok := reg.Lookup("child/child-1"); ok {
|
||||
t.Fatalf("销毁后父的入站 inputch 应被注销,实际残留:%+v", inbound)
|
||||
}
|
||||
if err := parent.DestroyResident("child-1"); err == nil {
|
||||
t.Fatal("重复销毁应报错")
|
||||
}
|
||||
@ -159,6 +164,9 @@ func TestResident_LifecycleAndNoOrphans(t *testing.T) {
|
||||
if _, err := osStat(filepath.Join(dir, "residents", id)); err == nil {
|
||||
t.Fatalf("子 %s 的 temp 目录应被丢弃", id)
|
||||
}
|
||||
if _, ok := reg.Lookup(inboundChannelName(id)); ok {
|
||||
t.Fatalf("父退出后子 %s 的入站 inputch 应被注销", id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user