refactor(config):自定义 Provider 环境变量改造#349
Conversation
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
|
/simplify |
结果已完成你在 已完成事项
代码变更
提交与推送
未执行项
|
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(config/state): use service-scoped lock for custom provider create
|
@xgopilot 针对本次PR,请给我一份给AIreview用的提示词,针对的是修改中所有可能存在的风险点 |
|
@xgopilot 你是资深 Go 代码审查员。请对 PR #349(refactor(config): 自定义 Provider 环境变量改造)做“纯风险导向”审查。 【审查目标】 【代码范围】
【必须覆盖的风险检查清单】
【输出格式】
【审查约束】
|
@xgopilot 只修复第1、2、5个问题,其他问题不许碰,修完提交PR到fork仓库中,而不是直接提交到目前的PR |
|
已按要求仅修复 1 / 2 / 5,其余问题未改动。 结果
具体修改
验证
|
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(config): 修复 provider 创建并发锁与前置校验
|
@xgopilot 针对本次PR,请给我一份给AIreview用的提示词,针对的是修改中所有可能存在的风险点 |
|
@xgopilot 你是资深 Go 代码审查员。请对 PR #349(refactor(config): 自定义 Provider 环境变量改造)执行“纯风险导向”审查。 【审查输入】
【必须检查的高风险面】
【输出要求】
【约束】
|
@xgopilot 只修复创建流程在 SaveCustomProvider 失败时没有执行回滚,可能残留脏目录/半成品文件和创建流程仅使用进程内互斥,缺少跨进程/跨 Manager 实例并发保护,存在 TOCTOU 窗口两个问题 |
完成结果已按你的要求仅修复这两个问题:
变更内容
验证
提交与推送
未执行
|
…ate lock Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(config): 补齐创建流程回滚与跨进程并发保护
|
/review |
| func lockProviderCreateCrossProcess(ctx context.Context, baseDir string) (func(), error) { | ||
| lockPath := filepath.Join(baseDir, providerCreateCrossProcessLockName) | ||
| for { | ||
| if err := os.Mkdir(lockPath, 0o700); err == nil { |
There was a problem hiding this comment.
High · Availability
This lock implementation can deadlock provider creation after an unclean exit. If a process crashes after creating .provider-create.lock, later runs will keep waiting until context timeout and never recover automatically.
Please add stale-lock recovery (for example: lock metadata with PID/start time + liveness check, or mtime-based lease/expiry) so a leftover lock directory does not permanently block CreateCustomProvider.
There was a problem hiding this comment.
完成情况
已按“仅修复这个问题”完成单点修复:处理 internal/config/state/service_provider_create.go 中跨进程目录锁在异常退出后遗留导致后续创建流程持续等待直至超时的问题。
本次改动
internal/config/state/service_provider_create.go- 为
.provider-create.lock增加租约文件与心跳续租。 - 在锁竞争时增加“陈旧锁回收”逻辑:超出阈值的锁目录会被自动回收后重试获取。
- 获取锁后初始化租约,释放锁时先停止心跳再清理锁目录。
- 为
internal/config/state/service_provider_create_test.go- 新增
TestLockProviderCreateCrossProcessReclaimsStaleLock:验证可回收陈旧锁并继续创建。 - 新增
TestLockProviderCreateCrossProcessWaitsForFreshLockUntilContextDone:验证新鲜锁不会被误回收,仍按上下文超时退出。
- 新增
验证
- 通过:
go test ./internal/config/state
提交与推送
- Commit:
7caf456 - 已推送分支:
fork-pr-349-1776437527 - Fork PR: fix(config/state): recover stale provider-create lock phantom5099/neo-code#34
未执行
- 未修改你未要求的其他问题(包括超时错误提示文案等)。
| }) | ||
| if err != nil { | ||
| err = rollback(processEnvApplied, userEnvPersisted, envPersisted, providerSaved, err) | ||
| if errors.Is(err, context.DeadlineExceeded) { |
There was a problem hiding this comment.
Medium · Error diagnosis regression
All context.DeadlineExceeded errors are rewritten as model discovery timeout, but this flow now also includes cross-process lock waiting and pre-discovery steps. When timeout comes from lock contention/stale lock, the current message is misleading (check base URL, API key, and network).
Please preserve the original stage (or add stage-aware timeout wrapping in CreateCustomProvider) so users get actionable guidance.
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: phantom5099 <245659304+phantom5099@users.noreply.github.com>
fix(config/state): recover stale provider-create lock
PR
完成任务
api_key_env,不再把 API Key 写入.env文件。.env相关实现下线:删除internal/config/envfile.go与对应测试,CLI 启动预加载改为 no-op。config/state服务层。API Key Env与API Key,提交流程改为调用服务层CreateCustomProvider。loadCustomProviders在读取目录失败时不再静默吞错。/models的data字段支持数组与单对象两种格式,异常类型给出显式错误。使用方案
TUI -> config/state service -> config,避免 UI 侧写配置与回滚逻辑。api_key_env。.env。达到效果
.env文件,明文落盘风险下降。API Key Env的有效性在提交前即可拦截。关键改动文件
internal/config/state/service_provider_create.gointernal/tui/core/app/update.gointernal/config/envvar.gointernal/config/env_platform.gointernal/config/env_platform_windows.gointernal/config/provider_loader.gointernal/cli/root.gointernal/provider/openaicompat/discovery.godocs/guides/configuration.md验证结果
internal/config/...、internal/config/state、internal/tui/core/app。internal/security存在既有失败用例(与本次改造无直接耦合),其余模块可通过。