|
|
b879558947
|
feat(proc): 共享段 arena 容量可配置(启动期生效,需重启内核)
## 改了什么
- `proc.NewHostWithArenaSize(bytes)`:按给定容量建段;保留 `NewHost()`
以兼容默认 4MB。
- 容量低于分配器最小尺寸时**返回明确错误**,不静默回落默认值
(否则"我配了 32MB"会悄悄变成"仍是 4MB")。
- 删除 `arenaPublishSize` 变量:自从容量改为入参后已无人读取,
留一个"看着能改、改了没效果"的开关比没有更危险。
- `core.plugin.shm_arena_mb`(默认 4,clamp 1..256):播种 + 定义 +
`Registry.arenaBytesFromConfig()` 读取。越界时记日志说明被 clamp。
## 为什么容量只能在启动时决定
arena 是统一区域里一段连续 mmap,而 `SharedRef` 存**绝对偏移**。
变大需要 remap,而每个 plugin.bin 子进程可能正在读同一页 ——
跨进程 munmap 会让它 SIGSEGV。该路径历史上三次被明确搁置。
⇒ 本改动只决定"这次启动开多大",配置项描述里已写明需重启。
## 判据(`internal/plugin/proc/test/arena_contract_test.go`)
TestArenaHostHonoursRequestedCapacity
给定 8MB → 能写入并读回 4MB(证明容量真的生效)
TestArenaHostRejectsTooSmallCapacity
64 字节 → 明确报错
变异验证:
忽略传入容量、总用默认 4MB → 4MB 写入报「超出 arena 容量 4194228」
过小容量改为静默回落默认 → 判据红
go build ./... / go vet ./... PASS
python3 .github/scripts/check-ci-gates.py PASS
go test ./... -count=1 -race 51 包 / 100 包无测试 / 0 FAIL
gofmt -l 干净
|
2026-11-14 11:32:03 +08:00 |
|