环境
- 组件:cosh-ng
- 版本:0.11.0
- 测试环境:Linux x86_64 (Alinux 4)
复现步骤
- 执行
cosh-cli svc start <不存在的服务名> --dry-run
- 观察 JSON 输出
- 对比
cosh-cli pkg install <不存在的包名> --dry-run
预期
- svc 的
--dry-run 应返回 ok=true,与 pkg 一致(dry-run 不查前置存在性,仅预演)
实际
- svc 返回
ok=false,error.code=SvcNotFound,error.message="Service '<name>' not found (unit not loaded)"
- pkg 返回
ok=true(dry-run 短路,不查存在性)
根因(源码定位)
crates/cosh-platform/src/svc.rs svc_action() 在 if dry_run { return Ok(...) } 短路之前调用 svc_status(name)?,导致服务不存在时直接返回 Err,绕过 dry-run 短路:
pub fn svc_action(name: &str, action: &str, dry_run: bool) -> Result<...> {
// ...
// Get current state before action
let before = svc_status(name)?; // ← 查存在性,不存在则 Err
let previous_state = before.state.clone();
if dry_run {
return Ok(SvcActionResult { ... }); // ← dry-run 短路在此,但已被前面 Err 拦截
}
// ...
}
对比 crates/cosh-platform/src/pkg.rs pkg_install(),dry-run 短路在最前,不查存在性:
pub fn pkg_install(distro, package, dry_run) -> Result<...> {
let mgr = distro.pkg_manager();
let (cmd, args) = match mgr { ... };
if dry_run {
return Ok(PkgInstallResult { ... }); // ← dry-run 短路在最前
}
// ...
}
影响
- Agent 用
svc <action> --dry-run 预演时会拿到失败信号,误以为后续真实操作也会失败,可能放弃或改变工作流
- dry-run 契约在 pkg 与 svc 子域之间不对称,违反 README 承称的"执行前预览"语义
- 同样问题影响
start / stop / restart / enable / disable 所有 svc 子命令
复现稳定性
3/3 稳定复现
修复建议
把 svc_action 的 let before = svc_status(name)?; 移到 if dry_run { return Ok(...) } 之后;dry-run 分支的 previous_state 用 SvcState::Unknown("(dry-run)") 或 SvcState::NotFound 占位,不实际调用 systemctl。
分类建议
PRODUCT_BUG
环境
复现步骤
cosh-cli svc start <不存在的服务名> --dry-runcosh-cli pkg install <不存在的包名> --dry-run预期
--dry-run应返回ok=true,与 pkg 一致(dry-run 不查前置存在性,仅预演)实际
ok=false,error.code=SvcNotFound,error.message="Service '<name>' not found (unit not loaded)"ok=true(dry-run 短路,不查存在性)根因(源码定位)
crates/cosh-platform/src/svc.rssvc_action()在if dry_run { return Ok(...) }短路之前调用svc_status(name)?,导致服务不存在时直接返回 Err,绕过 dry-run 短路:对比
crates/cosh-platform/src/pkg.rspkg_install(),dry-run 短路在最前,不查存在性:影响
svc <action> --dry-run预演时会拿到失败信号,误以为后续真实操作也会失败,可能放弃或改变工作流start/stop/restart/enable/disable所有 svc 子命令复现稳定性
3/3 稳定复现
修复建议
把
svc_action的let before = svc_status(name)?;移到if dry_run { return Ok(...) }之后;dry-run 分支的previous_state用SvcState::Unknown("(dry-run)")或SvcState::NotFound占位,不实际调用 systemctl。分类建议
PRODUCT_BUG