Skip to content

fix: harden runtime recovery and Windows tunnel reconnection - #249

Open
a251231 wants to merge 5 commits into
uvwt:mainfrom
a251231:dev/runtime-connection-recovery
Open

a251231 wants to merge 5 commits into
uvwt:mainfrom
a251231:dev/runtime-connection-recovery

Conversation

@a251231

@a251231 a251231 commented Oct 22, 2026

Copy link
Copy Markdown

背景

修复 Windows 控制面板/托盘在长时间运行后状态查询或启停卡住、旧版本 Core 占用端口,以及 VPN 切换后 cloudflared 进程仍存活但隧道连接全部失效的问题。最后一种情况可能表现为固定域名返回 HTTP 530 / Cloudflare 1033。

改动

Windows 启动、停止与桌面控制

  • 本地控制请求的读写遵循超时和取消,状态查询超过预算后回退到系统状态查询。
  • 停止/重启按安装目录清理旧 generation 的 Core,等待退出后再启动当前版本;保留更新调用链祖先进程及经过验证的 Tunnel supervisor。
  • 进程终止与自行退出发生竞态时,以同一进程句柄确认退出结果。

固定域名 Cloudflare Tunnel 的网络恢复

  • 现有 supervisor 统一检查属于当前 cloudflared 子进程的 /ready,并发布带 owner 和有效期的健康快照;CLI、面板和托盘共享状态。
  • 分别判断边缘连接、本地 Core /healthz 和公网 /healthz。进程存在或历史注册日志不再作为 Named Tunnel 当前就绪的证据。
  • 网络、路由或 DNS 变化后保留健康连接。启动宽限 45 秒、连续断线 30 秒且网络稳定后,终止并等待旧子进程退出,再用当前 component、Token 和 DNS 重建。
  • 默认使用 auto 协议,保留显式协议/解析器覆盖;增加退避、抖动及滚动窗口限流。主动停止取消健康请求、子进程及重试等待。
  • 公网或本地 Core 健康检查失败单独显示,不因这些失败重建仍有活动连接的隧道。现有 Quick Tunnel / Unix 生命周期保持各自边界。

连接恢复与相关安全边界

  • NexusDock 握手超时、失联检测和重连;及时注册并处理工具调用取消。
  • 失效 MCP 会话清理、畸形工具定义保护,以及 MCP 重定向的同源限制。
  • OAuth 清除与换码/刷新并发时,旧请求不能恢复已撤销授权。
  • ACP 管道写入和排队等待支持取消;部分写入失败后关闭连接,避免复用损坏的消息流。
  • 加固未认证本地 Runtime API 的回环/转发/Origin 边界、文件回滚冲突、文件名及可空工具参数校验。

同步 README 和 docs/runtime-access-and-recovery.md,并增加相应回归测试。本 PR 包含四个修复提交;个人 Fork 的测试发布工作流未纳入本 PR。

验证

在此 PR 分支上重新执行并通过:

  • Linux:go test -race ./... -count=1 -timeout=3m。
  • Windows:internal/desktopruntime 的 TestCoreRecovery|TestNamedTunnel|TestTunnelReady|TestTunnelHealth|TestTunnelRecovery|TestTunnelNetwork|TestTunnelMetrics|TestTunnelStatus 专项。
  • Windows:internal/desktopcontrol、internal/nexusbridge、internal/mcp/client、internal/mcp/oauthclient、internal/acp、internal/tool/file、internal/httpx、internal/tool/contract、internal/publicartifacts、scripts/test 测试。
  • 上述相关包的 go vet,以及 git diff --check。

Windows 测试使用 Go 1.26.5 和指向本机缓存的临时 -modfile,仓库的 go.mod/go.sum 未改动。Windows 专项使用真实隔离辅助进程,覆盖活进程断线、旧进程回收顺序、DNS 更新、主动停止、指标端口归属及陈旧快照拒绝。

实现阶段另外验证了共享 C# 服务/模型编译、状态 JSON 的新旧兼容、资源读取和 fake-cloudflared fixture 编译;真实 cloudflared 2026.9.1 / 2026.9.3 使用隔离无效 Token 验证新增参数可被解析,未启动真实隧道。

已知验证边界

  • Windows 全量测试曾在 TestStopBinaryProcessesTerminatesProcessThatReappearsDuringStop 间歇失败:启动 replacement helper 报 Access is denied。VPN 恢复改动前的本地基线对照也复现过此错误;这里不将 Windows 全量记为通过。
  • 完整 WinUI 构建受本机不完整的 .NET SDK 阻塞(MSB4236,缺少 Microsoft.NET.Sdk);共享 C# 编译不替代 XAML / WinUI 构建。
  • 真实 VPN 工具切换、企业 NRPT/加密 DNS、睡眠唤醒及多日运行尚待验收。DNS 默认按活动接口 IPv4 度量选择解析器,特殊解析策略需显式配置并验证。
  • 自动恢复不重放正在中断的有副作用请求;达到重试预算后继续遵守冷却窗口。

Monitor owned cloudflared readiness and network changes, refresh DNS on recovery, and serialize retries with stop cancellation and rate limits. Share fresh connection health with CLI, control panel, and tray. Add regression coverage and document recovery behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant