mirror of
https://github.com/tnb-labs/panel.git
synced 2026-10-13 16:58:05 +08:00
原先 pkg/shell 的执行函数不接 context,整条链路上的命令都无法随请求取消,
靠一条文件级 //nolint:noctx 压着。本次自底向上打通:
- pkg/shell 8 个执行函数加 ctx 首参并改用 exec.CommandContext,
删除与 Execf 重复的 ExecfWithContext
- pkg/{systemctl,tools,ntp,io,firewall,webserver,db,os} 的相关函数加 ctx,
firewall.Firewall 接口 10 个方法同步改
- internal/{apps,biz,data,job,service} 逐层打通,biz 的 10 个 Repo 接口
共 37 个方法加 ctx,mock 已重新生成
- types.App.Status 加 ctx:它经 loader 动态分发,contextcheck 看不穿,
33 个实现里的 context.Background() 是静态分析发现不了的死角
327 个 shell 调用点全部接上真实 ctx,contextcheck 从 364 条降到 0,
darwin 与 linux 双平台 golangci-lint 均为 0 issues。
其中 104 处用 context.WithoutCancel 显式断开取消链,因为这些操作被中途
杀死会留下损坏状态:面板自更新与自杀式重启(靠 sleep 熬过响应返回,绑
请求 ctx 会永远重启不了)、mongodb 改密码时 fork 的 --noauth 临时实例、
pure-pw 之后的 mkdb、s3fs 挂载失败回滚、写配置后的服务重启、以及各处
defer 清理与回滚闭包。
ExecfWithTimeout 现为 min(ctx, timeout),已逐个核对调用点:面板 HTTP
服务器未设 WriteTimeout、中间件链无 Timeout,请求 ctx 只在客户端真断开
时取消,原有超时语义不变。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>