mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 14:57:38 +00:00
refactor(kernelboot,kernelmod): ID:13 删死包 kernelboot/modules,整机启动图判据迁到 kernelmod/all
## 决策
删除 internal/kernelboot/modules(registry.go + registry_test.go),
把整机启动图判据迁到 internal/kernelmod/all(真实聚合入口)。
文件头那条 TODO(死包清理) 随包一起消失。
## 为什么这个包该删
实测零生产调用:
· 生产代码里 import 它的包数 = 0
· Register() / BuildModules() / Names() 的外部调用点 = 0
· 它的 Register/BuildModules 是 internal/kernelmod 那套注册表的**第二份实现**
(留着只会让人下次接错口子)
· kernelmod/all/facilities_sync_test.go 的注释里早已写明
「kernelmod 才是真实注册表(模块编译期工厂加载)」
## 判据迁移(能力未削弱,逐条实测)
- 判据 1–4(整机装配/层拓扑/严格逆序关闭/无残留): 只换宿主,
用 kernelmod.Registered() 作为装配输入不变,实测 5 层 / 17 模块 /
关闭顺序 [4 3 2 1 0] / 3 轮 goroutine 差值 0 / 订阅者 2→2
- 判据 5(TestEveryRegisteredModuleIsCompiledIn): 真相源是扫 `..` 源码树的
「目录+类型名 复合键 + 四方法齐全」,与宿主包无关。scanModuleTypes 的
modRoot 从 "../../kernelmod" 改为 ".."(本文件现在在 kernelmod/all/ 下)
- 删掉 `_ ".../kernelmod/all"` 自引用(判据现在与聚合入口同包,
本包被编译即聚合 import 生效 —— 反而更贴近生产同一条 import 链)
## 「新模块登记了但漏 import」仍咬得住(3 个变异亲测)
A 从 all.go 删 multimodal 聚合 import(叶子模块,无人依赖)
→ TestEveryRegisteredModuleIsCompiledIn 红(指名 multimodal)
→ TestEveryModuleDirIsImported 红
B 删 multimodal 的 init()(Register 调用点消失,真相源不能是被测入口)
→ TestEveryRegisteredModuleIsCompiledIn 仍红(源码侧多数一个类型)
C supervisor 的 Name() 改成非字面量
→ 判据显式失败(不静默跳过 ⇒ 不会变空转)
## 悬空引用清零
全仓 grep kernelboot/modules:代码/文档/CI 只剩 ci.yml 里一条
「那个包零生产调用,已删除」的历史说明。同步修正:
· ci.yml「整机启动图判据」步骤 → go test ./internal/kernelmod/all/
· ci.yml -race 排除表 pkg 行目标包 → internal/kernelmod/all
(该包现在装整机 ⇒ 同样会撞 KERNEL-REGISTRY-SETLOCK;
实测不带 -race 6/6 绿,排除仍必要,单号不变)
· ci.yml 三条说明文本(含证据步骤的提示语)
· kernelboot/kernelstate.go 指向旧判据路径的注释
· docs/zh/kernel-modularization-design.md §2.7 的 declarations.go 路径
· check-ci-gates.py §4 断言目标包 → ./internal/kernelmod/all/
(否则它盯的是一个已不存在的包)
## 验证
go build ./... = 0 error,go vet ./... = 0 error
go test ./internal/kernelboot/... ./internal/kernelmod/... = ok
go test -race ./internal/kernelmod/all/ = ok(连跑 6 次无 DATA RACE)
check-ci-gates.py EXIT=0;ID:15 的 verify_v4 矩阵复跑仍 5 变异全抓 + 误报项 EXIT=0 + 基线 EXIT=0
This commit is contained in:
15
.github/workflows/ci.yml
vendored
15
.github/workflows/ci.yml
vendored
@ -100,7 +100,7 @@ jobs:
|
||||
- name: go test ./...
|
||||
run: go test ./... -count=1 -timeout 20m
|
||||
|
||||
# 整机启动图判据(internal/kernelboot/modules/registry_test.go)。
|
||||
# 整机启动图判据(internal/kernelmod/all/bootgraph_test.go)。
|
||||
#
|
||||
# ## 为什么单列一步(而不是只靠上面的 go test ./...)
|
||||
#
|
||||
@ -111,11 +111,14 @@ jobs:
|
||||
# ② 它断言的是**跨模块的顺序与资源回收**,是"多跑几次才暴露"的那类,
|
||||
# 单独一步便于在 flaky 时被识别(这里带 -count=1,不吃缓存)
|
||||
#
|
||||
# ★ 判据宿主是 internal/kernelmod/all(真实聚合入口),不是以前的
|
||||
# internal/kernelboot/modules(那个包零生产调用,已删除)。
|
||||
#
|
||||
# ★ 不用 -race(那在 race job 里跑):本判据含真实端口/挂载,
|
||||
# -race 的插桩会让时序假设变松,两者分开放更便于定位。
|
||||
- name: 整机启动图判据(真实登记表装配 + 逆序关闭 + 无残留)
|
||||
run: |
|
||||
go test ./internal/kernelboot/modules/ \
|
||||
go test ./internal/kernelmod/all/ \
|
||||
-count=1 -timeout 10m -v
|
||||
|
||||
# 跨平台客户端版本一致性:内核 internal/meta 是唯一事实源,
|
||||
@ -222,7 +225,7 @@ jobs:
|
||||
# ║ ║
|
||||
# ║ **整包永久排除不被接受。** 唯一出口是给 plugin.Registry 的 Set* ║
|
||||
# ║ 加锁(修复单 KERNEL-REGISTRY-SETLOCK),修好后: ║
|
||||
# ║ · 删掉本表里 kernelboot/modules 那一行 ║
|
||||
# ║ · 删掉本表里 kernelmod/all 那一行 ║
|
||||
# ║ · **复跑一次** -race 全仓确认整机判据在 -race 下也稳定 ║
|
||||
# ║ · 删掉 evidence 步骤 ② 的静态断言 ║
|
||||
# ║ 这三步没做完,本线不算收口。 ║
|
||||
@ -234,7 +237,7 @@ jobs:
|
||||
# 列名:粒度|目标|原因|修复单号 (用 | 分隔,原因内可含空格)
|
||||
read -r -d '' TABLE <<'EOF' || true
|
||||
test|internal/plugins/webui|TestOpenAIStreamIsActuallyStreaming|gzipResponseWriter 的 mode/wroteHeader/buf 无锁;handler goroutine(发 finish/[DONE])与增量写 goroutine 并发写同一 ResponseWriter(gzip.go:139 读 mode vs gzip.go:206 写 mode)|WEBUI-GZIP-RACE
|
||||
pkg|internal/kernelboot/modules|*(整包)|该包把真实整机装起来 ⇒ 第 4 层 agent 与 plugin-host 并行 Init 时,双方都无锁直写同一 plugin.Registry 的 7 个 Set*(SetLuaVM/SetBaseAPIKey/SetSupervisor/SetTracker/SetConfig/SetStageHost/SetIndexer,registry.go:231-284)。竞争在**内核装配**里,不在本包代码里;任何装整机的用例都会撞上|KERNEL-REGISTRY-SETLOCK
|
||||
pkg|internal/kernelmod/all|*(整包)|该包把真实整机装起来(bootgraph_test.go 的整机判据) ⇒ 第 4 层 agent 与 plugin-host 并行 Init 时,双方都无锁直写同一 plugin.Registry 的 7 个 Set*(SetLuaVM/SetBaseAPIKey/SetSupervisor/SetTracker/SetConfig/SetStageHost/SetIndexer,registry.go:231-284)。竞争在**内核装配**里,不在本包代码里;任何装整机的用例都会撞上。★ 目标包随 ID:13 迁到此(原 internal/kernelboot/modules 已删)|KERNEL-REGISTRY-SETLOCK
|
||||
EOF
|
||||
|
||||
tests=""; pkgs=""; n=0
|
||||
@ -291,7 +294,7 @@ jobs:
|
||||
SKIP="${{ steps.skip.outputs.tests }}"
|
||||
|
||||
# 从全仓包列表里剔除 pkg 级排除项(按路径后缀精确匹配,
|
||||
# 不用 grep 模糊匹配 —— 否则 kernelboot 会把 kernelboot/modules 一起剔掉)。
|
||||
# 不用 grep 模糊匹配 —— 否则 kernelmod 会把 kernelmod/all 一起剔掉)。
|
||||
PKGS=""
|
||||
for p in ${{ steps.pkgs.outputs.pkgs }}; do
|
||||
drop=0
|
||||
@ -379,7 +382,7 @@ jobs:
|
||||
done
|
||||
echo " 仍为无锁直写的 Set*: $((total - locked))/$total"
|
||||
if [ "$locked" -gt 0 ]; then
|
||||
echo "::error title=内核 setter 已加锁::KERNEL-REGISTRY-SETLOCK 可能已被修复($locked/$total 个 Set* 形态已变)—— 请从 ci.yml 排除表删掉 kernelboot/modules 那一行"
|
||||
echo "::error title=内核 setter 已加锁::KERNEL-REGISTRY-SETLOCK 可能已被修复($locked/$total 个 Set* 形态已变)—— 请从 ci.yml 排除表删掉 kernelmod/all 那一行"
|
||||
fail=1
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user