40 lines
4.3 KiB
Markdown
40 lines
4.3 KiB
Markdown
# P5 等待核查与恢复回归
|
||
|
||
日期:2026-09-18。范围为内部 ContinuePoll 和 RearmWait,以及它们与原时钟、最终信号、人工核查和节点接管的衔接。实例公共 HTTP/SDK、完整接入场景与 P6–P7 生产验收继续实施,本报告不作为整个平台交付结论。
|
||
|
||
## 实现与边界
|
||
|
||
[等待恢复约定](../18-workflow-wait-recovery.md)区分两类操作:查询已被核实为成功 PENDING 时,保留当前激活,按权威结果事件时间和原间隔接续;独立 SIGNAL/TIMER 重建等待时,创建新代次并保留首次输入、契约、关联和截止。
|
||
|
||
继续查询需要当前权威任务、已处理 Inbox、原事件和固定结果契约相符,并写入来源事件、版本、轮次、步骤版本和时限的不可变审计证明。运行器核验证明后才能继续,原 Inbox 处置不被改写。等待换代最多32个激活,包含首次等待;TIMER 的自动运行和人工成功核查均使用首次激活时间。所有操作均需明确权限、原因、证据和当前版本;原键返回冻结回执。已到期、停止意图、信号赢家及未消费信号不能通过恢复绕过。
|
||
|
||
新等待、旧等待结清、步骤、检查点、审计及回执同事务;两类恢复均不自动解除实例核查,也不自行取得执行许可。复用已有结构,无新增迁移或持久化字段,保持35个实体、305个直接持久化字段声明、无数据库外键。
|
||
|
||
## 环境与证据
|
||
|
||
本机 darwin/arm64、Go 1.27.1、Docker MySQL 8.4.10。MySQL 均由脚本创建为隔离的一次性测试库。
|
||
|
||
| 检查 | 结果 |
|
||
| --- | --- |
|
||
| 存储专项 | 等待恢复10组及既有查询恢复、人工核查、时钟和信号回归通过,`-race`,62.023秒 |
|
||
| 实际进程专项 | 新增等待恢复与实际 Orbit 进程用例通过,`-race`,64.299秒;其中实际进程48.61秒、等待恢复14.39秒 |
|
||
| 基础回归 | `make fmt test vet build`通过,退出0,包含独立SDK和两个业务示例模块 |
|
||
| 完整隔离回归 | 整条脚本通过,退出0;存储全量214.576秒,实际流程进程包48.875秒(进程用例47.51秒),Worker SDK 92.595秒,最终SDK进程故障组93.095秒;19个SDK示例及2个独立业务示例全部通过 |
|
||
| 模型注释 | Go AST核对305个带db标签的直接字段声明,缺中文注释0 |
|
||
| 实际数据库结构 | v22测试库外键0、业务表无COMMENT字段0;迁移工具自身的5个元数据列单独计数,不包含在模型字段数中 |
|
||
| 文档静态检查 | 最终957个本地链接、53段JSON通过;`git diff --check`通过 |
|
||
|
||
10组专项覆盖:权威 PENDING 来源与原间隔、最终信号优先完成、接续审计失败全部回滚、假 PENDING 和轮次耗尽拒绝、时钟与审计证明不符拒绝、信号换代保留原截止及隔离旧信号、TIMER 使用首次计时、八路同键并发与旧目标拒绝及32代上限、未消费信号不得丢弃、等待重建审计回滚与截止耗尽。
|
||
|
||
实际进程用例确认所有旧控制进程退出后:
|
||
|
||
1. UNKNOWN 查询经人工核查确认为成功 PENDING,由两个新节点处理结果;再次全部退出后,显式接续原等待,再由两个全新节点按原间隔只创建下一业务轮。
|
||
2. 独立 SIGNAL 重建为第二代等待,旧截止不变;节点重新启动后接收第二代信号并推进后继任务。
|
||
3. 独立 TIMER 重建为第二代等待,节点重新启动后按第一次的绝对时间到期,后继任务最终完成。
|
||
|
||
该进程用例同时覆盖此前 TASK、POLL 同轮重试、停止结清、早到信号和查询竞争场景,累计22个任务,最终执行许可为0。
|
||
|
||
证据实现见[等待恢复专项](../../internal/storage/mysql/workflow_wait_recovery_integration_test.go)、[实际进程专项](../../internal/storage/mysql/workflow_runtime_process_integration_test.go)及[服务输入校验](../../weave/recovery/service_test.go)。完整复现入口为[隔离 MySQL 脚本](../../scripts/test-mysql.sh)。缺少一次性 DSN 或实际二进制而跳过的用例不计作通过;本机单数据库和多进程验证不替代生产复制、切换、备份恢复、容量或 RPO/RTO 验收。
|
||
|
||
完整回归开始后没有继续修改执行代码,仅补充阶段状态、接口交付顺序及验证记录。回归结束后脚本已清理本轮一次性测试容器。
|