Files
ShadowsocksX-NG/docs/adr/0037-runtime-failure-preserves-latest-intent.md
Qiu Yuzhou e0db8b1e13 refactor(runtime): publish isolated supervision generations
Separate Agent supervision from sslocal input and preserve the latest intent after deployment failure. Persist failure barriers, serialize publication and retirement, and verify reload and single-instance behavior with real processes.

Refs #83
2026-10-19 03:00:33 +08:00

2.7 KiB
Raw Permalink Blame History

运行部署失败保留最新意图,不自动恢复旧配置

Status:accepted(2026-10-19)。已实施;当前行为以代码为准。

运行部署失败不再通过恢复旧模式或重新部署旧运行配置来恢复服务。保留最新已保存意图和失败状态,防止用户选择与实际提供服务的配置静默分离。此决定统一适用于普通部署、模式切换和保存规则后的部署。

发布监管资料之前失败时,不发布半成品,原监管资料保持不变。这不属于发布后的自动恢复。监管资料发布后检测到部署失败时,停止仍存活的 sslocal 子进程,暂停系统代理,保留代理服务开关、系统代理开关及最新模式和规则意图;停止或系统代理清理失败必须继续报告失败,不得宣称服务已停止或系统代理已暂停。

本决定取代 ADR-0026 中 ACL 应用失败后尝试恢复旧运行配置的规则,以及当前代码中的模式切换失败恢复旧模式、规则默认动作与旧运行配置的行为。ADR-0026 的规则保存成功与运行状态收敛分离、串行部署及过期计算保护继续保留。ADR-0022 的系统代理意图与实际健康状态分离继续保留。

明确的部署失败只允许用户显式重试或新的运行意图触发再次部署。GUI 重新启动、普通状态轮询或 launchd 重启不得自行重试已失败的同一部署。失败状态及其所属部署必须在进程重启后仍可识别;代理服务开关保持开启不等同于再次部署授权。

健康运行后的子进程意外退出保留自动恢复,重放当前部署,不选择历史成功部署。恢复尝试若形成明确的部署失败,进入上述失败状态,不通过 launchd 无限重试同一失败部署。实现必须区分健康运行后的意外退出与启动、重载或重启过程中确认的部署失败。

运行文件清理不再为自动恢复旧配置保留历史部署;当前子进程仍使用的文件和各 ACL 变体的最新文件仍必须保留。停止完成前不得删除仍使用的文件。文件发布过程中失败的具体处理仍须在实现设计中明确,本决定不将这些路径默认为自动重新部署旧配置。

失败身份保存在 agent-deployment-failure.json,对应随机部署身份。GUI 收敛在分配新代次前比较当前意图;Agent 启动也检查该失败身份。显式开启重试会清除失败授权屏障;新运行配置可以发布新身份。健康运行后的子进程退出在 Agent 内重放当前监管资料,恢复启动或监听建立失败后记录失败并干净退出,不交给 launchd 形成无限重试。回执只记录 Agent 操作和监听证据,不声称上游已确认重载。