124 lines
10 KiB
Markdown
124 lines
10 KiB
Markdown
# ACM2-29 完成度核查与简化计划
|
||
|
||
日期:2026-09-08。核查基线:`7c2d22e`,开始时工作区干净。
|
||
范围:Plane ACM2-29 正文及评论、当前生产代码、迁移、测试与全部顶层设计文档。
|
||
本文包含本次本地修正,不代表代码已提交、发布或现场验收。
|
||
|
||
后续工作:[ACM2-30](https://plane.chans.xyz/space/projects/0b5086dd-dd33-4893-86d6-9e716a21b21f/issues/eb647af8-b9a5-4417-aeb6-f9da4e1a3661),已创建在 Backlog,正文已读回核对。与 ACM2-29 的 relates_to 创建返回成功;关系查询接口报参数错误,未能独立读回复核关联。
|
||
|
||
## 1. 结论
|
||
|
||
**ACM2-29 没有全部完成。** PostgreSQL 存储重构内核大体落地,但真实快照链路、查询接口、
|
||
部分保真与恢复不变量、数据迁移验收及 Oracle 完整适配尚未完成。
|
||
正文仍要求“全宽表零子表”,2026-09-08 09:49 评论已撤销该方案;17:44 评论又称 P2–P4 全部完成。
|
||
应按修订后的 v2 目标核查,不再按已撤销的正文补做有损槽位,也不将收口评论当作证明。
|
||
|
||
**存在局部过度工程化,主要是边界重复和文档失真,不是表数量本身。**
|
||
一套关系库、显式清除、明细保真、事务、FIFO、outbox 和回填重试都有具体失败场景支撑。
|
||
再次推倒已落地的无损存储会增加迁移风险;优先减少重复表示、未使用分支和无效承诺。
|
||
|
||
## 2. 原计划完成度
|
||
|
||
| 工作 | 核查结论 | 代码或证据 |
|
||
|---|---|---|
|
||
| P0:CAS 消息身份、成功后回填隔离 | 部分完成 | SnapshotFlow 锁内 LAST_MESSAGE_ID/CAS 已实现;回填待办写入再次失败仍可冒泡到处理失败边界。 |
|
||
| P1:无损表、命令和唯一写入口 | 内核完成,边界未全验收 | V1.3.0、FlightStateEngine、persistNextStates;9 张表/10 类集合。ROUT/ERUT、未知属性和空数组仍有缺口。 |
|
||
| P1:DNLD + 一个 FLOP 纵向链 | GTDT 已有;真实 DNLD 未完成 | JacksonXmlCodec 的 SCHD body 为 null;StageResult.parser 默认 null,仅测试赋值;主泵先要求 Handler,生产只注册 GTDT。 |
|
||
| P2-1:双读对拍 | 历史工具工作存在,未证明现场对拍 | 2af71e8 曾有双读比较,7c2d22e 移除旧读路径;当前保留 FlightStoreDiffTool,未见真实输入逐字段等值报告。 |
|
||
| P2-2:权威读、展示视图、查询接口 | 仓储和视图完成,接口未完成 | V1.3.1、FlightSchdReadAssembler;InboxController 的 /all/flights 仍是 TODO。 |
|
||
| P2-3:回填持久补偿 | 有待办和扫描,但崩溃窗口未闭合 | BACKFILL_TODO 在外部回填失败之后才 record;提交后立即崩溃时没有待办;轮询入队不会重置终态。 |
|
||
| P2-4:带数据升级 | 脚本可执行已验证,无损升级未完成 | FlywayMigrationTest 显式确认 V1.2 删除集合数据;没有旧集合回填到明细的实现。 |
|
||
| P2-5:锁内读取及语义矩阵 | 快照内核完成;文档与代码仍有偏差 | 增量事件在锁外预览产生;矩阵原称文本 Clear、DELY 历史保留及明细 FK,代码并不支持这些陈述。 |
|
||
| P3-A:PostgreSQL 验收 | 现有套件全绿,不是完整协议矩阵 | 本次基线 100 测试、0 失败、0 跳过,含 16 JDBC + 2 迁移测试;“16 类”样例未覆盖 ERUT 与 ROUT 共存。 |
|
||
| P3-B:Oracle 11g | 未完成,不只是等待现场 | 仅两个 SQL 模板;无 DDL、驱动接入和完整绑定,其他仓储仍含 PG SQL。 |
|
||
| P4:旧列退场、索引与回退窗口 | 代码退场完成,运营验收证据不足 | V1.4.0 删除旧列及冗余索引;没有真实查询 EXPLAIN、备份恢复与现场回退窗口关闭证明。 |
|
||
| 32 个 Handler | 未完成,后续业务范围 | 当前只有 GtdtHandler 生产实现,其余不应因存储收口而视为已交付。 |
|
||
|
||
ACM2-29 当前为 In Progress,本次没有修改其状态、正文或发表评论。
|
||
|
||
## 3. 具体问题与优先级
|
||
|
||
### A. 本次已修:日期差删破坏保留航班明细
|
||
|
||
JdbcFlightSchdRepository.deleteDiffByDay 原先先按传入 FLID 无条件删除明细,再按 FDAY 删除主行。
|
||
输入包含跨日迁移或 FDAY=NULL 的航班时,主行保留、集合丢失,违反快照域化差删不变量。
|
||
本次先按 FDAY 选择实际删除成员,主表与明细使用同一范围;继续由主泵事务行锁保护。
|
||
没有增加表或修改已发布迁移。
|
||
|
||
新增真实 PG 测试同时覆盖目标日期删除、跨日成员保留、ADFT 无归属成员保留;
|
||
原实现测试失败,修正后通过。它揭示的是此前测试矩阵遗漏,而非原测试结果造假。
|
||
|
||
### B. P0:尚未闭合的正确性边界
|
||
|
||
1. **路线键冲突**:V1.3.0 的 flight_route_point 主键只有 (FLID, ORDINAL),
|
||
replaceRoutes 对 ROUT/ERUT 各从 ordinal=1 写入,同航班共存时冲突。
|
||
通过新迁移改为 (FLID, ROUTE_KIND, ORDINAL),补真实 PG 往返与整事务回滚测试。
|
||
2. **补偿落账窗口**:Pump/SnapshotFlow 的回填在业务提交后执行,失败才写待办;
|
||
record 再失败会逃逸到 MessageProcessor.processOne 的 INFRA 落账,可能降级已提交成功态。
|
||
将回填意图与终态同事务写入;成功回填后确认待办。覆盖提交后立即崩溃、待办写失败、重复及 DEAD 终态。
|
||
3. **落库和 wire 来源不同**:GtdtHandler 锁外计算 preview/SchdPush,主泵锁内重新读态计算 nextState。
|
||
改为事务内一份 nextState 同时服务持久化与状态事件;保留独立 msg 通知意图的业务语义。
|
||
4. **“无损”不是全字段保证**:parseCollection 可接受非对象数组元素;未知属性被存储列映射忽略;
|
||
Replace([]) 的 wire 与读回不同;异常对象局部替换可能残留旧列;文本 null 清除与文档曾不一致。
|
||
固定合法字段/形状及空值黄金样例,未知输入显式拒绝,避免成功后静默丢字段。
|
||
|
||
以上 B 项本次记录为后续工作,没有声称已修复。
|
||
|
||
### C. P1:真实能力和验收
|
||
|
||
- 接通真实 XML DNLD/RESP 的解析、整包验证与路由,补无匹配/迟到 RESP;不依赖测试全局 parser。
|
||
- 实现 /all/flights 兼容接口;按真实 wire 契约验证。
|
||
- findAll/findByFlids 当前每航班追加 10 次集合查询;批量加载并明确同一数据库快照,
|
||
在实际规模下记录查询数和执行计划,不添加无消费方的索引或缓存。
|
||
- V1.1→V1.4 带数据升级必须提供备份/可信输入恢复步骤和逐字段核对;
|
||
不能把“确认旧集合已经丢失”的迁移测试作为无损验收。
|
||
|
||
### D. Oracle 是完整实施项
|
||
|
||
Oracle11gDialect 没有生产调用方,snapshot MERGE 的插入列包括 4 个追踪/时间字段,
|
||
模板尾部却只生成 3 个占位符;现有 PG 绑定也无法复用。
|
||
还需完整 DDL、其他仓储 SQL、生成 ID、CLOB、空值、驱动/Flyway/JDK 组合及目标 11.2 集成测试。
|
||
现场环境只影响目标库实测,不应把尚未编写的适配代码归为外部阻塞。
|
||
|
||
## 4. 简化方案
|
||
|
||
| 保留 | 简化或延后 | 原因 |
|
||
|---|---|---|
|
||
| 单库事务、行锁、身份、outbox | 不新增双库镜像/分布式协调层 | 当前单写者范围足够,不解决假设的扩容问题。 |
|
||
| 主表 + 明细 | 不重回固定槽位,不重新设计整套存储 | 三门、重复资源、多次操作是已有契约数据。 |
|
||
| FlightNextState | 逐步消除 Handler 预览与主泵重复计算、字段集 JSON 往返 | 一条状态生成路径更容易证明 DB/wire 等值。 |
|
||
| 必要 Clear/Replace | 删除未使用的 snapshotReplace 命令解析参数;Apply 待真实协议调用方再决定 | 两种解析行为实际相同,Apply 又假设了未确认的定位唯一性。 |
|
||
| 数据库列映射 | 复用已有单一列清单;其余资源元数据按需要集中,避免再造注册框架 | 减少漂移而不新增架构层。 |
|
||
| 回填待办 | 一条持久队列覆盖中断恢复 | 用事务登记意图替代失败后记录和额外重启推断。 |
|
||
| 当前 PG 实现和既定 Oracle 目标 | 不继续堆未运行的通用方言模板 | SQL、绑定、DDL 必须作为可执行整体设计。 |
|
||
| 回归与对拍 | 保留可发现失败的矩阵;不为删空壳编写镜像测试 | 验收关注故障行为而非类数量。 |
|
||
|
||
本次已实施的小范围简化:读写复用 FlightSchdReadAssembler 列清单,删除
|
||
FlightDetailTables 未使用的集合清单和 hasAnyDetailRows 旧回退探测;移除 commandsFromFields
|
||
未使用的 snapshotReplace 参数及全部调用实参;更新误导的双写注释。
|
||
大范围模型、API、数据迁移和 Oracle 实施进入新 issue,避免将未验证的业务变更混入文档整理。
|
||
|
||
## 5. 下一批实施顺序与验收
|
||
|
||
1. **可靠性收口**:路线键、回填意图、DB/wire 单一状态、严格字段验证。
|
||
验收:真实 PG 的正常/失败/回滚/重放/空值矩阵全绿,成功终态不降级。
|
||
2. **最小真实链路**:DNLD → GTDT → 完整查询 → outbox,并验证 RESP 守卫。
|
||
验收:实际 XML 输入,不手动赋值 StageResult.parser;真实存储和查询、事件契约一致。
|
||
3. **读模型与升级**:批量一致读取、实际查询计划、带数据恢复和对拍证据。
|
||
验收:查询次数按批次有界,集合/源序号/顺序保真,备份恢复有演练记录。
|
||
4. **Oracle 完整适配**:按既定部署边界实现并单独验收,不借 PG 绿灯替代。
|
||
验收:目标 11.2 上新建/升级、DML、并发锁、事务恢复及字符语义通过。
|
||
|
||
每一步交付时同步对应设计及完成证据。32 Handler 扩展、阶段 B 和生产运维仍按原业务工作项推进,
|
||
本 issue 不承诺一次完成所有产品功能。不以类已存在、迁移成功或合并提交代替功能/发布验收。
|
||
|
||
## 6. 本次验证与文档整理
|
||
|
||
- 基线 ./gradlew test:100 测试,0 失败,0 跳过。
|
||
- 新差删测试在原实现失败;修正后 ./gradlew test:101 测试,0 失败,0 跳过,
|
||
包括 17 JDBC 与 2 Flyway 测试,Testcontainers 提供真实 PostgreSQL。
|
||
- 未连接 Oracle,未验证现场部署、生产负载或历史数据恢复。
|
||
- 重写航班设计为当前实现基线;历史决策归档,有效决策缩为摘要;
|
||
同步 architecture/design/user-stories/semantics/README,旧评审明确标为历史。
|
||
- 新 [文档入口](README.md) 规定各文件唯一职责,后续不再维护多份阶段完成清单。
|