mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-28 21:33:05 +00:00
fix: 插件增量重载 + clawhubadapter ipcGoroutine 优雅退出
- Registry.Reload 改为增量: 对比插件入口文件(plugin.so/main.lua) SHA256, 仅重载有变更的插件, 未变更保持运行, 消除 plgreload 触发全量 StopAll+Load 导致的重复加载与内置插件状态错乱 - Registry 新增 pluginHashes 记录 + pluginEntryHash 辅助 - clawhubadapter.ipcGoroutine 无退出条件导致重载后旧 goroutine 永久残留(线程累积): 增加 stopCh/stopOnce, Stop() 关闭, ipcGoroutine 用 select 监听退出 - 新增 TestRegistryIncrementalReload 验证无变更跳过/变更重载
This commit is contained in:
@ -1,8 +1,12 @@
|
||||
package plugin
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
internalConfig "gitcode.com/JianFeeeee/HomeAgent/internal/config"
|
||||
sdk "gitcode.com/JianFeeeee/HomeAgent/internal/sdk"
|
||||
)
|
||||
|
||||
@ -202,3 +206,55 @@ func TestPluginManagerInterfaceReloadOne(t *testing.T) {
|
||||
// 编译期契约:Registry 必须实现 PluginManager(含 ReloadOne 单插件重载)。
|
||||
var _ sdk.PluginManager = (*Registry)(nil)
|
||||
}
|
||||
|
||||
func TestRegistryIncrementalReload(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
plgDir := filepath.Join(dir, "plugins")
|
||||
os.MkdirAll(plgDir, 0755)
|
||||
|
||||
// 一个 Lua 插件
|
||||
luaDir := filepath.Join(plgDir, "reloaddemo")
|
||||
os.MkdirAll(luaDir, 0755)
|
||||
os.WriteFile(filepath.Join(luaDir, "plugin.json"), []byte(`{"name":"reloaddemo","entry":"main.lua"}`), 0644)
|
||||
writeLua := func(body string) {
|
||||
os.WriteFile(filepath.Join(luaDir, "main.lua"), []byte(`local plugin = { name = "reloaddemo" }
|
||||
function plugin.start(sdk) sdk.log("info", "`+body+`") end
|
||||
function plugin.stop() end
|
||||
return plugin
|
||||
`), 0644)
|
||||
}
|
||||
writeLua("v1")
|
||||
|
||||
reg := NewRegistry()
|
||||
reg.SetPluginDir(plgDir)
|
||||
reg.SetConfigRegistry(internalConfig.NewConfigRegistry(""))
|
||||
|
||||
|
||||
// 首次 Reload:应加载 1 个
|
||||
msg, err := reg.Reload(plgDir)
|
||||
if err != nil {
|
||||
t.Fatalf("first reload: %v", err)
|
||||
}
|
||||
if len(reg.List()) != 1 {
|
||||
t.Fatalf("first reload loaded=%d, want 1 (%s)", len(reg.List()), msg)
|
||||
}
|
||||
|
||||
// 无变更再 Reload:不应重载(0 changed, 1 unchanged)
|
||||
msg, err = reg.Reload(plgDir)
|
||||
if err != nil {
|
||||
t.Fatalf("second reload: %v", err)
|
||||
}
|
||||
if !strings.Contains(msg, "0 plugins") || !strings.Contains(msg, "1 unchanged") {
|
||||
t.Errorf("unchanged reload should skip: %q", msg)
|
||||
}
|
||||
|
||||
// 修改 main.lua → 应重载该插件
|
||||
writeLua("v2")
|
||||
msg, err = reg.Reload(plgDir)
|
||||
if err != nil {
|
||||
t.Fatalf("changed reload: %v", err)
|
||||
}
|
||||
if !strings.Contains(msg, "1 plugins") {
|
||||
t.Errorf("changed reload should reload 1: %q", msg)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user