Files
orbit/docs/reports/phase-5-poll-recovery.md

35 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P5 有界查询跨激活恢复回归
日期:2026-09-18。范围为内部 POLL 人工重试及附属最终信号等待换代。核查确认 PENDING 后的显式等待接续、独立 SIGNAL/TIMER 等待重建、实例公共 HTTP/SDK、完整场景与 P6–P7 生产验收仍未完成,持续目标保持完整。
## 实现与边界
[查询恢复约定](../17-workflow-poll-recovery.md)将请求尝试与业务轮次分开。人工重试保留原业务轮编号和绝对截止,跨激活扣除真实尝试;成功 PENDING 才允许正常开启下一轮。已结束但未开始过的任务也受每轮任务数上限约束。旧结果只能作用于旧激活,旧信号赢家只保留历史,新等待使用新代次和原契约/关联/截止。
新激活、任务、轮次、预算、等待、时钟、额度、审计与回执同事务。UNKNOWN、待消费或隔离结果、有效尝试和许可、原停止意图、预算及截止仍由恢复规则约束;恢复后需显式 Continue 才解除核查门控。迁移000022只增加两个带中文注释的预算字段,平台仍为35个持久化实体、305个直接持久化字段声明,无外键、无级联。
## 环境与证据
本机 darwin/arm64、Go 1.27.1、Docker MySQL 8.4.10;每轮使用脚本创建的一次性隔离容器及数据库。
| 检查 | 结果 |
| --- | --- |
| 首批存储专项 | 新增9组查询恢复、原16组人工核查、时钟/信号、v9应用额度升级、新建Schema及v7无外键升级通过,`-race`,64.729秒 |
| 扩展专项 | 12组查询恢复、真实v21预算升级、实际Orbit进程通过,`-race`,54.694秒;恢复13.14秒、升级4.46秒、实际进程35.64秒 |
| 基础回归 | `make fmt test vet build`通过,退出0;包含独立SDK和两个业务示例模块 |
| 完整隔离回归 | 整条脚本通过,退出0;存储全量208.573秒,实际流程进程包37.148秒,Worker SDK 92.526秒,最终SDK进程故障组97.279秒;19个SDK示例与2个独立业务示例全部通过 |
| 模型注释 | 使用Go AST逐字段核对:305个带db标签的直接字段声明,缺中文说明0 |
| SQL结构和文档 | 实际v22测试库外键0、无COMMENT业务字段0;932个本地链接与53段JSON检查通过 |
12组专项覆盖:同轮恢复后进入下一业务轮并再次恢复、同轮剩余尝试耗尽、成功PENDING不能绕过轮次上限、十路同键并发及撤权回执拒绝、审计失败全回滚、UNKNOWN先核查与消费、信号新代次和原截止、原请求截止耗尽、尝试计数与真实行数不符、零尝试激活上限、旧winner证据保留及禁止复用、满额/停止意图拒绝。
实际进程测试确认全部旧控制进程退出后创建同轮新激活,再由两个全新进程竞争接管;保留原请求截止和剩余2次尝试,收到PENDING后只创建一次下一业务轮,并最终成功。该测试累计16个任务、无额外查询或许可泄漏;此前TASK、停止、信号、TIMER等进程恢复用例也同时运行。
v21升级夹具用于验证迁移:保留旧轮次1/2、原预算、截止、revision及创建/更新时间,补入first_round=1和历史尝试0;非法恢复预算被CHECK拒绝。v9还原夹具同步删除v22新字段后走正式迁移;不修改历史迁移校验和。所有关联继续由服务端事务检查。
证据实现见[查询恢复专项](../../internal/storage/mysql/workflow_poll_recovery_integration_test.go)、[v21升级专项](../../internal/storage/mysql/workflow_poll_recovery_upgrade_integration_test.go)和[真实进程专项](../../internal/storage/mysql/workflow_runtime_process_integration_test.go)。
完整复现入口是[隔离MySQL脚本](../../scripts/test-mysql.sh)。缺少一次性DSN或实际二进制而跳过的用例不计为通过。本地双进程和单MySQL故障验证不替代生产复制、切换、备份恢复、容量或RPO/RTO验收。
完整回归结束后,一次性测试容器均已由脚本清理。最终检查932个本地链接、53段JSON,错误0;`git diff --check`通过。本轮执行逻辑在完整回归开始后未再修改,后续只补充模型说明与文档中的剩余范围。