Files
orbit/docs/reports/phase-4-clock.md

54 lines
4.8 KiB
Markdown
Raw 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.
# P4/P5 定时等待与查询轮次回归
日期:2026-09-18。范围为内部持久化等待运行器;SIGNAL、完整管理控制、实例公共API/SDK和生产验证继续按原计划执行。
## 实现范围
- TIMER与POLL复用待续表到期索引和当前激活身份;首批创建、结果消费、时钟推进及审计同事务。
- 原等待时间、总截止、已用轮次和单轮尝试预算不因暂停、满额或重启重置。
- 后续查询复用首轮精确输入、业务键、互斥键、处理器与冻结策略;上一轮必须已经成功查询并分类为PENDING。
- 截止扫描让已落库Inbox结果先完成裁决;仍在途时保留步骤ACTIVE与当前任务,由Pulse收集实际结果和释放许可。
- 迁移000019从真实v18结构回填等待时钟,不覆盖原检查点、不改变预算、不回填终态实例或旧激活;无新增实体、列、索引或外键。
具体语义见[定时与查询文档](../13-workflow-clock.md)。模型维持35个实体、295个直接持久化字段声明,中文注释保留;内部检查点JSON字段同步提供中文说明。
## 环境与证据
本机darwin/arm64、Go 1.27.1、Docker MySQL 8.4.10。全部数据库为临时隔离测试库,未连接业务库或远端生产库。
| 检查 | 结果 |
| --- | --- |
| `make fmt test vet build` | 已通过,退出0,覆盖服务端、SDK与独立示例module |
| 时钟及相关真实MySQL定向回归 | 14组时钟场景、v18升级、原运行器/实例受理、新建结构及v7无外键升级通过,`-race`,44.745秒 |
| 真实Orbit进程恢复 | 已通过,15.093秒;强杀/全停后由两个新进程接续原结果、到期TIMER及下一轮POLL |
| 全量隔离集成回归 | 已通过,退出0;全存储160.211秒、流程进程14.928秒、Worker SDK 92.976秒、SDK进程故障94.972秒;19个SDK示例和2个独立业务示例全部通过 |
定向入口:
```sh
go test -race -count=1 -run '^TestIntegration(WorkflowClock|WorkflowClockUpgrade|WorkflowRuntime|WorkflowInstanceAdmission|SchemaAndConstraints|NoForeignKeysUpgrade)$' -v ./internal/storage/mysql
go build -o /tmp/orbit-clock-test-server ./cmd/orbit
ORBIT_TEST_SERVER_BINARY=/tmp/orbit-clock-test-server go test -race -count=1 -run '^TestIntegrationWorkflowRuntimeProcess$' -v ./internal/storage/mysql
```
以上命令须设置`ORBIT_TEST_MYSQL_DSN`指向一次性数据库;未配置时用例跳过,不能据此声称通过。[全量脚本](../../scripts/test-mysql.sh)负责隔离MySQL、构建二进制并显式运行进程测试。
数据库直接复核外键0、缺少COMMENT的业务字段0;代码复核295个直接持久化字段声明均含中文注释。文档复核847个本地链接和53个JSON代码块,错误0;`git diff --check`通过。
存储测试覆盖12个并发定时消费者只创建一个后继、8个并发查询消费者只增加一轮、暂停/满额保留预算、等待被总截止截短、延迟消费已到期事实、审计及轮次写入故障回滚、单轮重试与业务轮次区分、超时收集已落库结果、在途UNKNOWN结清、首轮输入及所有者损坏拒绝。v7升级验证70个历史外键全部移除,323项原索引组件和任务数据保留,额外添加外键时启动检查拒绝。
进程测试先确认所有控制进程已经退出,再让TIMER自然到期或提交查询PENDING结果;启动两个全新进程后核对原唤醒时间/绝对截止未改变、无重复任务,查询只产生两轮后由DONE完成。业务任务由真实Pulse执行存储授权与结束,实例使用内部Start;这不替代尚未开放的实例HTTP/SDK端到端回归。
开发过程中修正了两个测试夹具问题:业务键保留尾部空格而互斥键禁止首尾空格,因此互斥键改用实例ID;带互斥键的任务同时占用多类许可,因此核验原许可数量未变并在Pulse结清后归零。生产输入校验与许可规则未因此放宽。
首次全量存储回归因新故障注入用例未恢复原任务所有者而失败:后续全局租约恢复扫描正确拒绝了这条损坏关联。已为输入/所有者故障注入补齐退出恢复,最终完整重跑通过;不放宽生产关联校验,也不将首次失败计为通过。最后基础检查也已重跑通过,上表全量记录包含该修订。
## 剩余原定范围
1. SIGNAL早到、重复、超时、契约与关联校验;最终信号和在途查询竞争。
2. FAIL_AFTER_SETTLED分支取消/收集/终态判断,以及暂停、继续、取消和人工恢复公共操作。
3. 实例、步骤、来源、信号和审计HTTP/独立SDK、通用场景示例。
4. P6–P7监控、完整故障矩阵、性能容量、MySQL高可用与备份恢复、SDK发布核对。
这些回归验证单个MySQL下的状态与进程故障恢复,不给出生产容量、RPO/RTO或数据库高可用承诺。