fix: retry precommit mysql lock conflicts

This commit is contained in:
2026-09-20 21:47:30 +08:00
parent 30a8081bd9
commit a1e6fcc07f
7 changed files with 170 additions and 8 deletions

View File

@@ -9,6 +9,7 @@
| 本地发布门禁统一入口 | 2026-09-20;`make release-local-check` | PASS;服务端、SDK、独立示例竞态测试、vet、build、当前协议门禁、146个 Markdown 本地链接和 SDK 独立依赖检查均通过;命令明确不替代真实 MySQL 集成与目标生产验收 |
| 发布物静态身份清单 | 2026-09-20;`make release-manifest`;无 `ORBIT_MYSQL_DSN` | PASS;输出构建/协议身份及28条迁移名称与SHA-256校验和,未读取数据库、凭据或业务数据;目标库仍需单独执行 `orbit-admin verify` |
| 发布物与管理二进制绑定校验 | 2026-09-20;`go test -race ./cmd/orbit-admin`;匹配/修改 revision/未知命令场景 | PASS;`verify --manifest` 在数据库连接前拒绝身份、协议或迁移校验和不一致的清单,匹配清单通过;不修改数据库 |
| 提交前事务死锁恢复 | `go test -race -run TestRetryableTransactionErrorOnlyMatchesPreCommitLockFailures ./internal/storage/mysql`;真实 MySQL `TestIntegrationWithTxRetriesPreCommitDeadlock` | PASS;两事务真实锁环触发 1213,失败事务仅在提交前按有界退避重试一次,最终两笔事务各提交一次;Begin/Commit 错误不重放,目标拓扑锁等待和死锁率仍需生产观测 |
| 就绪探针排空门控 | `go test -race ./internal/transport/httpserver ./cmd/orbit`;`TestReadinessEntersDrainBeforeShutdown` | PASS;SIGTERM 关闭路径先将 `/health/ready` 置为 503,再进入限定优雅关闭窗口;响应不泄露内部错误 |
| 健康探针响应契约 | 2026-09-20;`go test ./internal/transport/httpserver && go test -race ./internal/transport/httpserver && make docs-check` | PASS;`/health/live` 与 `/health/ready` 返回 `Cache-Control: no-store`、`X-Content-Type-Options: nosniff`;未就绪和排空状态返回 `Retry-After: 1`,并由 HTTP 契约测试覆盖 |
| 数据模型中文注释门禁 | 2026-09-20;`go test ./internal/storage/mysql -run 'Test(FreshInstallBaselineHasChineseModelComments|FreshInstallBaselineContainsNoReferenceDDL|MigrationsAfterForeignKeyRemovalDoNotReintroduceReferences|PostRemovalMigrationGuard)$'` | PASS;当前无外键基线逐表、逐持久化字段检查中文 `COMMENT`,并继续阻止后续迁移重新引入引用约束 |
@@ -27,6 +28,7 @@
| Go 1.27.1 标准全量隔离回归(优雅下线排空门控后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-mysql.sh`;Docker MySQL 8.4.10 | PASS,退出码0;存储/迁移252.852秒、metrics进程6.762秒、Orbit流程全停接管45.696秒、SDK Worker/Event/任务/流程故障组、24个示例、3个负载工具及 result-inbox/task-outbox 均完成真实服务串跑;就绪排空门控未破坏租约恢复、流程接续或优雅退出,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(排空状态指标后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 sh scripts/test-mysql.sh`;Docker MySQL 8.4.10 | PASS,退出码0;存储/迁移249.882秒、metrics进程6.802秒、Orbit流程全停接管45.554秒、SDK Worker/Event/任务/流程故障组、24个示例、3个负载工具及 result-inbox/task-outbox 均完成真实服务串跑;`orbit_process_draining` 固定 gauge 和关闭路径未破坏既有行为,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(Hub 背压配置后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 make integration`;Docker MySQL 8.4.10 | PASS,退出码0;存储与迁移、metrics 启停、流程全停接管、Worker/Event 租约与 ACK 恢复、队列背压、优先级/键并发、重试与未知结果、定时任务、Weave 流程暂停/信号/定时器/查询/恢复、24 个 SDK 示例、3 个负载工具及 result-inbox/task-outbox 均完成真实服务串跑;Hub 连接上限、派发协程和有界队列配置未破坏既有行为,临时数据库已清理 |
| Go 1.27.1 标准全量隔离回归(提交前事务重试后) | 2026-09-20;宿主机 Go 1.27.1 darwin/arm64;`GO=go DOCKER=docker ORBIT_TEST_MYSQL_IMAGE=mysql:8.4 make integration`;Docker MySQL 8.4.10 | PASS,退出码0;存储/迁移254.604秒,其中真实 `TestIntegrationWithTxRetriesPreCommitDeadlock` 触发两事务锁环并确认 1205/1213 前提交重试;metrics进程7.156秒、流程全停接管45.734秒、SDK Worker/Event/任务进程组130.052秒、流程进程组14.121秒、Workflow SDK29.432秒、result-inbox35.737秒、task-outbox34.500秒,24个示例和3个负载工具均完成真实服务串跑;提交回执不明故障、租约恢复、Weave流程恢复和原幂等行为均保持,临时数据库已清理 |
| MySQL COMMIT 包截断故障 | MySQL 8.4.10 与 Go 测试容器共享网络命名空间;`127.0.0.1` DSN;两组提交前/后切点 | PASS;`TestIntegrationWorkflowCommitFaults` 8个子场景与 `TestIntegrationCredentialCommitFaults` 均通过,预期 `unexpected EOF` 为故障注入结果 |
| Go 1.27.1 Orbit 控制进程全停/接管 | 同一共享网络命名空间;容器内构建 Linux Orbit 二进制;`ORBIT_TEST_SERVER_BINARY=/tmp/orbit go test -race -run '^TestIntegrationWorkflowRuntimeProcess$'` | PASS,42.958 秒;强杀、全停、定时器、轮询、信号、人工复核和双节点接管均通过 |
| Go 1.27.1 SDK Worker/Event 子进程故障 | 同一共享网络命名空间;容器内构建 Orbit 二进制;SDK `TestIntegration(Worker\|Event)Process` | PASS,121.600 秒;派发未送达、租约接管、ACK 提交回执丢失、慢消费者对等节点推进、重试未知结果、计划/优先级/键并发和任务接管均通过 |