feat: recover poll activations within original round budgets
This commit is contained in:
34
docs/reports/phase-5-poll-recovery.md
Normal file
34
docs/reports/phase-5-poll-recovery.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# 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`通过。本轮执行逻辑在完整回归开始后未再修改,后续只补充模型说明与文档中的剩余范围。
|
||||
Reference in New Issue
Block a user