Repository navigation
Description
目的与当前结论
对近两个月 main 上的重要修复做一次 main → 4.2-dev 回迁评审跟踪,优先减少稳定性、正确性、内存及异常清理问题,同时避免把 main 的新架构、被撤回的策略或不适用的补丁带入稳定分支。
这是候选清单,不是已批准的 cherry-pick / 发布清单。 下文“优先评审”表示建议先投入评审资源,不代表已设定仓库 severity,也不代表零风险。每项仍需负责人确认适用场景、最小依赖、回迁方案和 4.2 上的验证结果。本 issue 不替代各原始 bug issue;不重复创建这些已有根因的问题。
当前建议:
- 先评审相对集中的 RPC / 内存引用 / frontend / lock-error 修复。
- WAL、锁生命周期、存储去重、HNSW、ISCP、CDC 等单独形成专项回迁方案。
- FileService 性能项按实际后端及 cache 配置选择。
- 已覆盖、已撤回、与当前工具链不适用或大范围重构的项不直接回迁。
1. 固定对照范围与证据边界
| 项目 | 固定基线 |
|---|---|
| 审计日期 | 2026-11-04(Asia/Shanghai) |
| main 合并 PR 时间窗口 | 2026-09-04 至 2026-11-04 |
| main | 0a7847abed712ed893d841a3c5fa415327eec761 |
| 4.2-dev | a3cfb7551431d7e9d87c33383fb13c44e3757873 |
| 共同祖先 | 2758eb1d3f812759c03c7c8a7463e2757dacb633 |
创建 issue 前已再次核对远端,以上两条分支 SHA 未变化。后续分支会继续前进,执行回迁前必须重新核对实际目标 SHA、是否已存在等价修复以及 main 的后续修正/回退。
方法与限制:
- 对合并 PR 元数据/标题筛选,再重点阅读候选 PR、相关 issue 及固定 4.2 生产代码;不是对两个月所有变更完成了逐行审计。
- 判断缺口不只依赖 merge SHA 是否存在,还检查 4.2 的旧路径、等价实现及后续修复。
- 下文“main 测试/真实 SQL/现场记录”指相关 PR/issue 中记录的证据;不表示本轮重新执行了那些测试,更不表示已在 4.2 复现或验收。
- 本轮只做静态核对和部分补丁文本适用性检查;没有实际 cherry-pick、编译、UT/BVT、生产操作或发布。
- 客户的 4.2.1 hotfix 与 4.2-dev 是不同基线。本清单不能直接当作客户 hotfix 缺陷清单,也不能据此断言当前客户某条错误已经定位。
- CN / TN / Proxy / 共享组件要分别确认。尤其 TN、ISCP owner 接管、native 索引兼容问题,不能默认“只升级一个 CN”就闭环。
2. 建议评审顺序
| 分组 | PR | 排期依据 / 注意事项 |
|---|---|---|
| A:优先评审,稳定性与内存 | #30761、#29586、#29559、#30536、#28384、#29352、#29725、#29448、#29199 | 4.2 保留具体旧路径;#29559 与 #30536 联合检查;#29199 优先级取决于大参数 prepared 使用情况 |
| B:核心专项,不能机械 CP | #29283、#31380、#30321、#29397、#29558、#29066、#30823、#28176、#29801 | 事务/锁/存储/native/任务生命周期变化;须拆清语义、依赖和混版本风险 |
| C:按配置选择的 I/O / cache 项 | #32053、#32137、#30519、#29092 | MinIO、关闭 diskcache、COS、FIFO 回收分别核对;#29092 仅取适用子问题,排第二批 |
| D:第二批或待补证据 | #30109、#32022、#29860、#31574 | 不全部按严重现场故障处理;#31574 尚未完成独立分支适用性确认 |
| E:当前不直接迁入 | #30117、#29692、#28525、#28265 | 分别为后续撤回、工具链不适用、已有更完整覆盖、大型重构 |
以上共 30 条记录,包含候选与明确排除项;不是发现了 30 个已实测的 4.2 生产 bug。
3. 逐项评审记录
以下代码链接均固定在上述 4.2-dev SHA。每项合并日期为 UTC;main merge SHA 用于准确定位原补丁,不表示可原样 CP。
A. 优先评审
#30761 — 首次 catalog replay 期间 logtail 断流后,receiver 等 resume、connector 无重连信号,CN bootstrap 可卡住超时
- 原 PR:#30761;main 合入:2026-10-21T18:06:31Z;merge
1362ffba7090。 - 相关原 issue:#30760。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/vm/engine/disttae/logtail_consumer.go:1055。
- 4.2 代码证据:仍直接发布 ready/first=false;没有 firstReplayDone/completeFirstConnect。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:中:重连状态机适配;验证首次回放中断、恢复、SQL readiness。
- 证据边界:原问题在4.2.6升级现场出现;main有确定性真实服务测试。
补充评审要点:原问题出现在 4.2.1 → 4.2.6 的升级过程中:首次 catalog replay 与 TN 重启/断流交叠,receiver 暂停,而 connector 没有继续重连的信号,最终 bootstrap 等待超时。应复用 PushClient 已有首次连接责任,避免再造一套 ready 状态机。验证首次回放前/中/后断流、恢复、关闭和 SQL readiness;既不能永久卡住,也不能在 catalog 尚不可读时提前接流量。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29586 — 长耗时 unary RPC 尚未响应却被 idle GC 回收;checkpoint/备份等可能 backend connection closed
- 原 PR:#29586;main 合入:2026-10-03T13:12:44Z;merge
ff4468a7849c。 - 相关原 issue:#29582。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/common/morpc/client.go:1829。
- 4.2 代码证据:只按 Locked/LastActive 判断,缺少 markIdle 的活跃 Future 检查。
- 影响 / 升级范围:RPC客户端所在组件。
- 回迁风险与必要验证:较小;长请求+空闲GC+取消+清理队列满。
- 证据边界:main有真实socket反例;完整补丁 apply-check 通过,未编译。
补充评审要点:必须区分“连接很久没活动”和“仍有未完成的 unary Future”。验证请求超过 idle 阈值但未超过自己的 deadline、取消、正常完成、清理队列满等组合。本 PR 还含 ISCP 逻辑行数相关改动,落地时逐项核对,不能把整个 PR 描述成仅一个 RPC 判断。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29559 — FinishStream 持 streamStateMu 同步等发送,writer退出清理也需此锁,可能清理死锁
- 原 PR:#29559;main 合入:2026-10-01T15:21:36Z;merge
32f54981401f。 - 相关原 issue:#29560。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/common/morpc/server.go:917。
- 4.2 代码证据:仍在 streamStateMu 内 cs.Write;Close 同样取锁。
- 影响 / 升级范围:共享MORPC,重点CN流水线。
- 回迁风险与必要验证:中:与#30536一起核对writer/terminal/message所有权;不可直接照抄main周边。
- 证据边界:main有确定性死锁反例和两CN测试。
补充评审要点:重点检查 FinishStream → Write/等待 writer → writer 退出 → Close → streamStateMu 的等待环。与 #30536 一起评审 terminal claim、message/Future 和连接缓冲的唯一清理责任;不能只把一把锁挪走而留下 double terminal、消息丢失或新等待。验证双 CN 流水线、FIN/错误/取消并发、断链和 writer 退出。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#30536 — session Close 提前释放仍被 writer Encode/Flush 使用的连接缓冲
- 原 PR:#30536;main 合入:2026-10-18T22:26:31Z;merge
2508ce7029b0。 - 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/common/morpc/server.go:693。
- 4.2 代码证据:Close仍调用conn.Close;未推迟到writer finalizer。
- 影响 / 升级范围:共享MORPC。
- 回迁风险与必要验证:较小改动但必须验证并发Close/Write;与#29559合并验证。
- 证据边界:完整补丁 apply-check 通过,未编译。
补充评审要点:需要把“断开连接、打断 I/O”与“释放 writer 尚在使用的缓冲”分开,由 writer finalizer 完成最终释放。验证 Close 与 Encode/Flush 并发、重复 Close、启动失败和异常退出;与 #29559 联合回归,不能仅凭单个补丁无冲突判断安全。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#28384 — 未绑定allocation account的off-heap realloc先释放旧地址、后移除元数据;地址复用可串代/panic
- 原 PR:#28384;main 合入:2026-09-08T07:38:10Z;merge
585a38efd152。 - 相关原 issue:#28383。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/common/mpool/mpool.go:1526。
- 4.2 代码证据:物理ReallocZero在removePtrMetadata之前。
- 影响 / 升级范围:使用mpool的服务。
- 回迁风险与必要验证:较小;分配失败回滚、并发地址复用、normal/race。
- 证据边界:确定性allocator边界反例;非已复现SQL进程崩溃;完整补丁apply-check通过。
补充评审要点:适用的是未绑定 allocation account 的 off-heap realloc 分支;已走 allocate-copy-free 的 accounted 分支不能混为一谈,也不能用它替代 #28369。证据为 allocator 地址释放/复用边界反例,并非本次重现了 SQL 级进程崩溃。验证分配失败时元数据回滚、并发地址复用、profile 记录及 normal/race 路径。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29352 — prepared查询完成后scope仍引用已关闭reader及旧PartitionState,空闲长连接可持续持有大块内存
- 原 PR:#29352;main 合入:2026-09-24T13:48:39Z;merge
c701ffa4ef76。 - 相关原 issue:#29326。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/sql/compile/scope.go:333。
- 4.2 代码证据:p.Cleanup之后未清s.DataSource.R。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:小;prepared反复执行/空闲保留/错误退出。
- 证据边界:完整补丁apply-check通过;不声称解决所有CN OOM。
补充评审要点:关闭 reader 不等于删除 scope 对 reader 的引用。应在已有 Cleanup 所有权下断开引用,不新增长期 registry。验证 prepared handle 反复执行、执行结束后保持连接空闲、错误/取消/Close,以及 reader 不重复释放;观察引用链和内存回收,不把任何 CN OOM 都归因到这里。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29725 — 旧锁owner连接关闭返回EPIPE/ECONNRESET时未进入换绑恢复,Unlock清理可能残留
- 原 PR:#29725;main 合入:2026-10-08T17:03:27Z;merge
9df2c4006142。 - 相关原 issue:#29714。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/lockservice/lock_table_remote.go:544。
- 4.2 代码证据:retryRemoteLockError缺失EPIPE/ECONNRESET/net.ErrClosed。
- 影响 / 升级范围:LockService相关组件。
- 回迁风险与必要验证:较小;生产修复集中在分类器,测试需适配。
- 证据边界:main有public Unlock反例。
补充评审要点:错误分类只负责进入既有换绑恢复,不能将 EPIPE/ECONNRESET 一律吞掉当作 Unlock 已成功;binding 没变时仍需满足原来的确认协议。验证旧 owner 连接失效、binding 已变/未变、重试取消和事务关闭后无遗留锁。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29448 — 登录握手与连接关闭竞态、非法proxy salt可触发slice panic
- 原 PR:#29448;main 合入:2026-09-28T14:56:12Z;merge
1ded9fc91480。 - 相关原 issue:#29446。
- 本轮分类:优先排期;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/frontend/mysql_protocol.go:1632。
- 4.2 代码证据:makeHandshakeV10Payload反复GetSalt并直接切片,无长度/关闭快照检查。
- 影响 / 升级范围:CN和Proxy。
- 回迁风险与必要验证:较小至中;接口签名涉及双方;正常登录和断连并发测试。
- 证据边界:4.2保留旧路径;不声称已确定某次现场panic触发者。
补充评审要点:应先取得一致的握手/关闭状态与 salt 快照并验证长度,再构造 payload;同时检查 proxy 帧长度边界。涉及 CN/Proxy 调用签名时需要成套适配。验证正常密码认证、关闭竞态、短 salt、非法帧;目前不能据此断言某一次现场 panic 的触发者。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29199 — prepared LONG_DATA分块重复复制累积前缀并保留历史值;大参数上传严重放大内存
- 原 PR:#29199;main 合入:2026-09-22T04:08:56Z;merge
170a559c858d。 - 相关原 issue:#29187。
- 本轮分类:优先排期;排期参考:场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/frontend/mysql_protocol.go:744。
- 4.2 代码证据:每块append旧值再SetAnyToStringVector,无累计参数上限控制。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:中;驱动LONG_DATA协议、EXECUTE/RESET/CLOSE、迁移边界。
- 证据边界:main原始协议验证4MiB数据曾引起约400MiB RSS增长;非生产保证。
补充评审要点:PR 的原始 MySQL 协议对照记录中,4 MiB 参数分 64 块上传曾导致约 400 MiB RSS 增长,修复后约 22 MiB;这是该测试记录,不是所有驱动/部署的保证。验证 COM_STMT_SEND_LONG_DATA 累计预算、失败后 EXECUTE 错误保持、RESET/CLOSE 释放、后续 statement 不受污染及迁移限制;不能只在单块上传处限长。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
B. 核心专项回迁
#29283 — merge输出的旧RowID被tombstone过滤后没有回退到appendable替代行,TN点查/去重漏判
- 原 PR:#29283;main 合入:2026-09-24T09:40:06Z;merge
3da27b1d1f01。 - 相关原 issue:#29284。
- 本轮分类:核心专项回迁;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/vm/engine/tae/txn/txnimpl/base_table.go:152。
- 4.2 代码证据:getRowsByPK仍共用单一RowID向量;没有候选集合。
- 影响 / 升级范围:TN。
- 回迁风险与必要验证:中高;查重/merge/重启/写入性能,关注每对象候选分配成本。
- 证据边界:存储层确定性反例;不能写成普通CN SQL已复现重复PK。
补充评审要点:核心是先保存 appendable/non-appendable 候选,再按 tombstone 与可见性选出仍有效的行,不能由一个已被删除的旧 RowID 遮住替代行。现有证据是存储层 GetByFilter/Dedup 反例,普通 CN SQL 并发重复主键并未在本次重现。验证 merge 与新 append 交叠、tombstone、重启和 dedup;关注每对象候选分配及写入热路径性能。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#31380 — 最终WAL消息超过LogService上限后持续重试并使TN panic,影响无关业务
- 原 PR:#31380;main 合入:2026-10-28T12:58:05Z;merge
21d67b276d67。 - 相关原 issue:#31350。
- 本轮分类:核心专项回迁;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/vm/engine/tae/txn/txnimpl/cmdmgr.go:56。
- 4.2 代码证据:仍在group callback序列化,无最终大小准入;PrepareWAL错误直接panic。
- 影响 / 升级范围:TN;核对LogService接收上限。
- 回迁风险与必要验证:高;大小边界、pre-append回滚、LSN/DSN连续、group commit性能及恢复。
- 证据边界:有main TKE现场;4.2相同危险路径;不是仅提高消息上限。
补充评审要点:main 的现场记录为 merge 携带 transferred deletes 后最终 WAL 约 106 MB,超过 LogService 100 MiB 限制,重试约 3 分钟后 TN panic。原先约 70 MiB 的估计不能约束最终序列化大小。修复涉及约 31 个文件,应在消费 LSN/DSN/提交不可逆状态前完成最终消息大小准入,不能简单提高接收上限。验证大小边界、拒绝后的回滚/资源释放、其他错误仍按原语义 fail-stop、group commit 吞吐、WAL replay;这不是只升级一个 CN 能闭环的修复。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#30321 — 混合行锁/范围锁下waiter与物理范围两端责任不平衡,锁残留及内存增长
- 原 PR:#30321;main 合入:2026-10-16T06:10:35Z;merge
ac55588b8d4b。 - 相关原 issue:#30313。
- 本轮分类:核心专项回迁;排期参考:高(非 severity 标签)。
- 固定 4.2 位置:pkg/lockservice/lock_table_local.go:101。
- 4.2 代码证据:oldOffset替换判断/c.offset=c.idx仍在;加入range仅记录一个key。
- 影响 / 升级范围:LockService相关组件。
- 回迁风险与必要验证:高;不得覆盖#28529旧分支独立修复;验证多CN换主、取消、超时、hotpath性能。
- 证据边界:main生产代码反例,checker panic不等于生产配置必然panic。
补充评审要点:要按 waiter 身份及实际加入的锁范围两端核对所有权,不能只依赖 offset 判断是否替换。main 的 reuse checker panic 是测试证据,生产配置不一定以同样 panic 表现,实际可能是保留/增长。4.2 已有 #28529 的独立旧分支修复,不能被 main 整文件覆盖丢失。验证行锁加入范围锁、取消、下一次准入失败、多 CN 换主、remote owner、范围两端释放和热点锁吞吐。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29397 — 显式事务中DROP DATABASE失败仅回滚语句,再COMMIT可误删恢复表的自增分配器
- 原 PR:#29397;main 合入:2026-09-27T07:31:51Z;merge
346e02b49856。 - 相关原 issue:#29395。
- 本轮分类:核心专项回迁;排期参考:场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/incrservice/service.go:216。
- 4.2 代码证据:删除仍登记事务级deletes并于txnClosed处理,无statement callback回滚。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:中高;与4.2自增缓存及语句回滚集成,验证DDL失败后继续COMMIT。
- 证据边界:main真实MySQL线协议前后对照;4.2保留旧责任模型。
补充评审要点:语句 rollback 与整个事务终态不是同一责任边界:失败 DROP DATABASE 恢复了表,但事务级 deletes 仍可能在后续 COMMIT 删除其 allocator。应与 4.2 既有语句/事务回调融合。验证事务内先成功写入,再 KILL QUERY/失败 DROP DATABASE,再分别 COMMIT/ROLLBACK,之后原表自增 INSERT 仍正确;不能只测整个事务一起回滚。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29558 — FORCE INDEX读取可NULL UNIQUE隐藏表时漏掉包含NULL的行
- 原 PR:#29558;main 合入:2026-10-01T16:34:49Z;merge
c2cad8af38f1。 - 相关原 issue:#29555、#29557。
- 本轮分类:核心专项回迁;排期参考:场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/sql/plan/apply_indices.go:983。
- 4.2 代码证据:hinted covering/backfill入口缺少NULL完整性证明。
- 影响 / 升级范围:CN planner。
- 回迁风险与必要验证:中;优先移植nullable UNIQUE完整性部分,不捆绑main Decimal256优化。
- 证据边界:main真实SQLwrong-result;4.2同样存在hinted访问入口。
补充评审要点:本轮建议仅提取 nullable UNIQUE 访问完整性修复:隐藏 UNIQUE 表不含某些 NULL 键,FORCE INDEX 的 covering/backfill 路径必须证明相关键非 NULL,否则回退到完整数据来源。本 PR 另含 Decimal256 等比较优化,不能默认整包迁入。验证单列/复合 UNIQUE、OR、NULL、hint、join/聚合以及与无索引 oracle 的结果一致性;正确性回退可能变慢,应明示。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29066 — 并发写入/父表删除期间ADD FOREIGN KEY可能使用旧快照通过验证,留下孤儿数据
- 原 PR:#29066;main 合入:2026-09-26T12:03:32Z;merge
b1b68925d7f6。 - 相关原 issue:#28934。
- 本轮分类:核心专项回迁;排期参考:场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/sql/compile/ddl.go:635。
- 4.2 代码证据:普通子表锁/父表catalog锁,缺乏专用freshness和父表data锁协议。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:中高;RC/SI、多CN、锁序与超时rollback;DDL持锁时间会增加。
- 证据边界:main两CN实测;4.2原路径仍在。
补充评审要点:并发 ADD FOREIGN KEY 需要同时保证子表验证快照足够新、父表数据在验证/提交窗口内受到正确保护。不能仅加 catalog 锁。验证 RC/SI 下并发子表 INSERT、父表 DELETE、双 CN、锁顺序、超时/取消后的 metadata rollback;新增 data lock 会影响 DDL 与写入并发,需测量而非声称零性能影响。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#30823 — HNSW DELETE后INSERT复用已删除节点,破坏图连通性,持久漏召回;旧库另有重删插自旋
- 原 PR:#30823;main 合入:2026-10-26T16:51:52Z;merge
47652f7a1aa1。 - 相关原 issue:#30660。
- 本轮分类:核心专项回迁;排期参考:HNSW场景高(非 severity 标签)。
- 固定 4.2 位置:thirdparties/Makefile:32。
- 4.2 代码证据:仍用usearch-2.25.3.tar.gz。
- 影响 / 升级范围:HNSW执行CN及native artifacts。
- 回迁风险与必要验证:高;不是只改版本号,必须带MO定制修复tarball;旧模型读写/重启/混合版本兼容与索引重建评估。
- 证据边界:main有bare-usearch和真实SQL反例;升级不自动修复历史已损图。
补充评审要点:PR 提供 bare-usearch 与真实 SQL 反例:删除后复用节点破坏图连接,漏召回在保存/重启后仍存在;另有重删插场景自旋。必须使用包含 MO 定制修复的 native tarball,不能仅把版本字符串改为上游 vanilla 2.26.5。验证 native ABI、旧模型读写、reserve 语义、滚动升级、删除/插入稳定性与 recall/延迟。升级程序不自动修复历史已损坏的图,需要单独判断重建。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#28176 — ISCP水位刷新用仅含LSN的JobStatus覆盖状态,Stage退回Init并可能重复非幂等初始化
- 原 PR:#28176;main 合入:2026-09-05T11:20:56Z;merge
845fff8ee9ca。 - 相关原 issue:#28175。
- 本轮分类:核心专项回迁;排期参考:异步索引场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/iscp/consumer_entry.go:167。
- 4.2 代码证据:仍构造JobStatus{LSN:...}整块写回;没有原子初始化生命周期证据。
- 影响 / 升级范围:所有可能接管ISCP任务的CN。
- 回迁风险与必要验证:高;旧任务quarantine/索引重建与滚动升级接管策略,不能只滚一个CN就承诺闭环。
- 证据边界:4.2直接存在原错误写入;main方案带明确运维代价。
补充评审要点:仅把 Stage 字段补回并不足以覆盖初始化原子性。main 方案还涉及保留 Stage 的 JSON 更新、InitSQL 与 Running 原子提交、旧 LSN CAS、LifecycleVersion,以及无法证明初始化历史的旧任务隔离/重建。评审需明确是否采用完整生命周期语义,避免在 4.2 再造重复状态机。所有可能接管 ISCP 的 CN 都需兼容,或明确限制 owner;只滚一个 CN 后旧 owner 仍可能覆盖状态。旧任务隔离会有可用性成本,必须给出升级/重建流程。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29801 — CDC目标事务整体回滚后只重试失败语句可部分写入并推进水位;驱动错误分类也不匹配
- 原 PR:#29801;main 合入:2026-10-09T19:46:21Z;merge
a6e19ccf7761。 - 相关原 issue:#29434。
- 本轮分类:核心专项回迁;排期参考:CDC场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/cdc/sinker_v2_executor.go:315。
- 4.2 代码证据:活跃e.tx仍进入逐语句execWithRetry;缺少整事务错误传播修复。
- 影响 / 升级范围:CDC执行CN。
- 回迁风险与必要验证:中高;成套移植分类/失败传播/整事务重放;不能只加retry error code。
- 证据边界:main真实connector/rollback反例;4.2相关旧执行路径存在。
补充评审要点:必须区分目标执行器实际使用的 matrixorigin/mysql 驱动错误与上游驱动类型,并让已失败的目标事务整体失败/重放。若目标数据库回滚整个事务,只重试最后一条语句可能漏写前面的语句却推进 watermark。验证 1213、1205 及目标端 rollback 配置、错误持续传播、完整 batch replay、watermark 不前进、取消和清理;不能只回迁错误码分类器。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
C. I/O 与 cache:按场景回迁
#32053 — 有限范围读取请求开口后缀,Close还下载丢弃尾部,I/O放大
- 原 PR:#32053;main 合入:2026-11-03T06:54:32Z;merge
1876b2f93e14。 - 相关原 issue:#31692。
- 本轮分类:性能场景回迁;排期参考:MinIO场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/fileservice/minio_sdk.go:602。
- 4.2 代码证据:getObject无Range上界,Seek后Close中io.Copy(io.Discard)。
- 影响 / 升级范围:MinIO SDK使用组件CN/TN。
- 回迁风险与必要验证:中;4.2没有main identity reader接口,按旧架构移植;搭配fix(fileservice): avoid full-object reads without disk cache #32137。
- 证据边界:HTTP字节计数反例;不是diskcache锁问题。
补充评审要点:有限范围请求应在每次重试都保持正确的 Range 上界;Close 不应为复用连接而下载并丢弃剩余大对象。4.2 没有 main 的 identity-reader 接口,应在原有 FileService/SDK 责任内做最小语义移植。验证真实 SDK/HTTP Range、实际下载字节数、partial read/Close、取消、retry 与 EOF;不是根据延时就认定 diskcache 锁 bug。与 #32137 配套看。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#32137 — 未配置diskcache仍按默认策略拉整个对象,无法缓存被多读的部分
- 原 PR:#32137;main 合入:2026-11-04T05:40:30Z;merge
b27f3869e6f2。 - 相关原 issue:#31692。
- 本轮分类:性能场景回迁;排期参考:关闭DiskCache场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/fileservice/s3_fs.go:1002。
- 4.2 代码证据:仅forceMinimalRangeRead触发最小range;没有s.diskCache==nil判断。
- 影响 / 升级范围:S3FS使用组件CN/TN。
- 回迁风险与必要验证:较小;测试内存cache-only及零容量;MinIO还需fix(fileservice): bound MinIO range reads without draining on close #32053。
- 证据边界:生产代码边界匹配,main真实SDK HTTP oracle。
补充评审要点:即使 MinIO SDK 修好范围,S3FS 上层在没有 diskcache 时仍请求整个对象,也会继续放大 I/O。验证没有 diskcache、零容量配置、memory-cache-only、正常 diskcache 开启,以及跨 range/重试行为;真实 HTTP 字节 oracle 与业务 TP/AP 性能均需核对。不能把小对象的 SDK 反例等同于完整生产吞吐验收。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#30519 — COS LOAD边界探测提前结束时Close继续读完整个后缀,放大下载与延迟
- 原 PR:#30519;main 合入:2026-10-18T11:33:53Z;merge
799523418e9f。 - 相关原 issue:#30511。
- 本轮分类:性能场景回迁;排期参考:COS场景高(非 severity 标签)。
- 固定 4.2 位置:pkg/fileservice/qcloud_sdk.go:924。
- 4.2 代码证据:closeFunc仍io.Copy(io.Discard, resp.Body)。
- 影响 / 升级范围:COS读取CN/TN。
- 回迁风险与必要验证:较小至中;适配旧函数,核对partial read/retry及连接复用变化。
- 证据边界:main真实SDK和LOAD probe反例。
补充评审要点:COS 的 LOAD 边界探测可能只需少量数据,但 Close 继续 io.Copy 到 EOF 会读取巨大尾部。移植时验证真实 SDK 与 LOAD probe、partial read、retry、取消。提前关闭可能改变 HTTP/1 连接复用,关注连接建立率和整体吞吐;不是去掉一行 io.Copy 就宣称无代价。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29092 — FIFO同步回收遇到已删除main队列记录时过早停止
- 原 PR:#29092;main 合入:2026-09-18T09:03:36Z;merge
d97251938429。 - 相关原 issue:#29088。
- 本轮分类:第二批;排期参考:中(非 severity 标签)。
- 固定 4.2 位置:pkg/fileservice/fifocache/fifo.go:687。
- 4.2 代码证据:进度只检查used1;未识别used2变化;4.2不存在新reservedBytes机制。
- 影响 / 升级范围:CN/TN内存cache。
- 回迁风险与必要验证:只取FIFO进度修复;不要整包引入main reservation/accounting架构。
- 证据边界:两个问题仅FIFO子问题适用4.2。
补充评审要点:本轮只建议 FIFO eviction 的进度判断修复:used1 没变但 used2 已下降时不应错误认为无进展。4.2 不存在 main 的 reservedBytes/reservation 机制,不要借此引入整套新 cache accounting/guard。验证混合队列、删除条目、容量收缩、pin/并发释放及 eviction 热路径。此项属于性能/回收类第二批。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
D. 第二批 / 待进一步核实
#30109 — logtail换连接时旧stream的context canceled泄漏到仍有效的只读屏障请求
- 原 PR:#30109;main 合入:2026-10-13T15:44:25Z;merge
c5208fc54d1a。 - 相关原 issue:#30123。
- 本轮分类:第二批;排期参考:中(非 severity 标签)。
- 固定 4.2 位置:pkg/vm/engine/disttae/logtail_consumer.go:2131。
- 4.2 代码证据:readBarrier单次调用后直接返回;#31571没有替代此修复。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:中;4.2 PushClient生命周期不同,不能引入重复owner状态。
- 证据边界:并非数据损坏;只读barrier重试,不是重放DDL。
补充评审要点:只对旧 transport 被替换而调用方 context 仍有效的只读 readBarrier 做恢复;调用方自己取消/超时必须及时退出。不是重放 DDL/DML。4.2 PushClient 生命周期不同,复用已有 owner/连接代际信息;#31571 的测试稳定性修改不能当成该修复已覆盖。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#32022 — 订阅状态锁内写诊断日志,日志sink阻塞可拖住无关表读取
- 原 PR:#32022;main 合入:2026-11-02T10:52:29Z;merge
b4d1a674ce0d。 - 相关原 issue:#32021。
- 本轮分类:第二批;排期参考:中(非 severity 标签)。
- 固定 4.2 位置:pkg/vm/engine/disttae/logtail_consumer.go:1773。
- 4.2 代码证据:状态变更方法defer Unlock后日志仍在锁内。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:中;保留4.2 incarnation/newEntry所有权,不覆盖为main简单entry。
- 证据边界:main确定性阻塞反例;无生产P95改善保证。
补充评审要点:在锁内取得日志所需快照、锁外记录,避免日志 sink 阻塞扩大成跨表阻塞;不能为移日志覆盖 4.2 已有 incarnation/newEntry 生命周期。验证阻塞日志 sink、并发订阅/退订/换代。没有现场 P95 改善保证,按实际证据排期。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29860 — 恶意或损坏的length-encoded报文发生uint64转int溢出并触发slice panic
- 原 PR:#29860;main 合入:2026-10-11T07:02:44Z;merge
4572ca1839b2。 - 相关原 issue:#29859。
- 本轮分类:第二批;排期参考:较低(非 severity 标签)。
- 固定 4.2 位置:pkg/frontend/mysql_protocol.go:1223。
- 4.2 代码证据:边界判断仍pos+count-1;readStringLenEnc先int转换。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:小;完整补丁apply-check通过,需wire协议回归。
- 证据边界:已报告EXECUTE panic被恢复为SQL错误,不按CN必然宕机分类。
补充评审要点:长度必须在 uint64 域验证后才能安全转换为 int/做 slice 边界运算。覆盖恶意/截断包及正常 EXECUTE/参数协议。已知 EXECUTE panic 会被恢复为 SQL 错误,因此不按“任意坏包必然杀死 CN”描述。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#31574 — CN logtail replay batch保留重复rowid/time和无用tombstone列
- 原 PR:#31574;main 合入:2026-10-28T12:51:11Z;merge
4808a7befd38。 - 本轮分类:第二批;排期参考:按内存证据决定(非 severity 标签)。
- 固定 4.2 位置:pkg/vm/engine/disttae/logtailreplay。
- 4.2 代码证据:需进一步独立核对分支依赖,未列为已确认首批。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:涉及读路径与size accounting;必须做4.2内存/性能A-B。
- 证据边界:main微基准已有轻微变慢,不承诺无性能影响。
补充评审要点:保留为后续调查,不列为已确认必须回迁:尚未完成独立的 4.2 依赖/字段可删性核对。main 的微基准记录也有约 3.7%–5.4% 的延时增加,不能只看节省内存。若进入回迁,应有真实 catalog/logtail 内存驻留、replay CPU、查询延迟和 size accounting 的 A/B 结果。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
E. 不直接回迁的记录
#30117 — HNSW缺覆盖证据即退全表扫描;main已通过#30989撤回HNSW主体
- 原 PR:#30117;main 合入:2026-10-22T04:32:55Z;merge
cca94b810ce8。 - 本轮分类:暂不孤立回迁;排期参考:排除(非 severity 标签)。
- 固定 4.2 位置:pkg/sql/plan/apply_indices_hnsw.go。
- 4.2 代码证据:不能将被后续撤回的策略当当前main稳定修复。
- 影响 / 升级范围:CN。
- 回迁风险与必要验证:先明确异步ANN语义;不要孤立CP。
- 证据边界:大表全表扫描回退可能严重降性能。
补充评审要点:main 随后通过 #30989 撤回 HNSW 主体策略,原因包括大表回退全扫描的明显性能影响。不能把两个月窗口内曾经合入过等同于当前 main 仍认可的稳定修复;异步 ANN 的一致性/覆盖语义需另行决策。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#29692 — Go1.27.0 database/sql死锁;4.2使用1.26.4
- 原 PR:#29692;main 合入:2026-10-08T07:45:16Z;merge
1a0088790c88。 - 本轮分类:暂不直接回迁;排期参考:不适用当前工具链(非 severity 标签)。
- 固定 4.2 位置:go.mod:4。
- 4.2 代码证据:当前4.2-dev go1.26.4;PR给出的1.26.4控制组不受该bug影响。
- 影响 / 升级范围:构建工具链。
- 回迁风险与必要验证:不为此问题额外升级整个工具链。
- 证据边界:实际构建若覆盖go.mod需另查构建receipt。
补充评审要点:此处针对 Go 1.27.0 database/sql 的特定死锁,而固定 4.2 基线 go.mod 是 Go 1.26.4,PR 的控制组记录中不受该问题影响。如果实际构建覆盖了 go.mod 工具链,应另查 build receipt;当前不据此额外升级整个工具链。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#28525 — 备份soft-deleted checkpoint对象选择
- 原 PR:#28525;main 合入:2026-09-09T16:00:35Z;merge
9475a9c22992。 - 本轮分类:已有覆盖;排期参考:无需重复CP(非 severity 标签)。
- 固定 4.2 位置:pkg/backup/tae.go:828。
- 4.2 代码证据:4.2 selectBackupObjects已包含更完整的历史保留/GC扫描证明。
- 影响 / 升级范围:CN/TN备份链。
- 回迁风险与必要验证:不能用旧补丁覆盖更完整现有修复。
- 证据边界:已代码确认。
补充评审要点:4.2 的 selectBackupObjects 已演进为更完整的历史保留与 GC 扫描证明逻辑。不要拿较早的简单 soft-delete 选择规则覆盖它,避免退化;“没有同一个 merge SHA”不等于“没有修复”。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
#28265 — ordered ODKU整体重构
- 原 PR:#28265;main 合入:2026-09-06T13:44:14Z;merge
a6ee7171327e。 - 本轮分类:暂不批量回迁;排期参考:高风险大改造(非 severity 标签)。
- 固定 4.2 位置:pkg/sql/plan/bind_insert.go。
- 4.2 代码证据:4.2存在不同ODKU演进及已回迁[4.2] fix(plan): lock the resolved ODKU row #31957;未宣称本PR每个子问题仍在。
- 影响 / 升级范围:CN/TN与计划协议。
- 回迁风险与必要验证:约56文件/万行量级;按真实case拆最小修复,连同#31963依赖审查。
- 证据边界:不是安全小补丁。
补充评审要点:ordered ODKU 约 56 文件、万行级变化,另有 #31963 等后续依赖;4.2 已有自己的演进和 #31957 等修复。若出现明确客户 case,应先构造反例,再拆最小语义补丁并审查计划协议/执行器兼容,不把整个 DML 重构作为本轮常规 CP。
评审状态:待负责人确认;尚无本轮 4.2 回迁 PR / 运行验证结论。
4. 已有覆盖,避免重复回迁或误判客户基线
以下是本轮核对中排除的典型重复项,不是所有已回迁修复的完整目录:
| 原修复 / 对应 PR | 4.2-dev 核对结论 |
|---|---|
| #28369 | Vector.Area / allocation account 相关修复已在本次 4.2-dev 基线;不能由此推断旧 4.2.1 hotfix 也有 |
| #31127 | prepared/window reset 相关修复已有覆盖 |
| #30796 | CTE reader/batch 清理相关修复已有覆盖 |
| #28280 | 订阅库 secondary index 查询相关修复已有覆盖 |
| #29504 | 历史备份对象相关修复已有覆盖 |
| #32080 | 最新 backup MinIO logical-size 对应回迁已包含在固定 4.2 head |
| #32081 | compress scratch / merge batch 清理相关修复已有覆盖 |
| #28525 | 4.2 的 selectBackupObjects 已有更完整逻辑,不能用较早简单规则替换 |
额外边界:
- #29748 的存储层去重时间戳/行窗口反例,不能直接外推成“普通 CN SQL 一定可重复主键”;正常 CN 的悲观 PK 锁及快照刷新可能阻断该时序。未作为本轮已证实的普通业务 blocker,若要推进应先补端到端可达性证据。
- #30117 必须连同撤回 #30989 一起理解;#28265 必须连同 #31963 等后续演进核对,不能只看原 PR 曾经合入。
- 表中“已有覆盖”只针对固定 4.2-dev,不是对任何已发布 4.2.x 镜像或 hotfix 的承诺。
5. 补丁文本适用性检查:仅用于估算适配工作量
使用独立临时 git index,以固定 4.2 SHA 初始化,执行原 main commit 的差异:
git diff <main-merge-sha>^ <main-merge-sha> --binary
| git apply --cached --check
没有改动工作树或分支。该方法不是 git cherry-pick 的三方合并,也不能替代语义检查。
- 在检查的 25 个补丁中,完整文本检查通过的 5 个为:#28384、#29352、#29586、#30536、#29860。
- 未通过完整文本检查的为:#30321、#29559、#30109、#30823、#29558、#31380、#32022、#29397、#29199、#29448、#32053、#29283、#29066、#32137、#30519、#29725、#28176、#29801、#30761、#28165。fix(lockservice): cover float table-lock keyspace #28165 为筛选阶段额外检查项,不因此新增为本 issue 的回迁推荐。
- 上述失败包括代码上下文或测试文件差异;不代表三方合并必然失败,也不代表不能做最小适配。
- 上述通过仅表示文本能应用;不代表能编译、测试通过、依赖齐全、运行安全或可发布。
6. 设计与工程质量评审要求
回迁时先确认“原职责归谁”,再确定补丁:
- 生命周期/关闭/释放使用已有 owner、terminal 和错误传播路径,不重复维护状态机、registry 或缓存真相。
- 同一个不变量只保留一个有效实现;新增分支要说明为什么需要,不能永久并存两套校验/执行路径。
- 不能用 main 整文件覆盖丢失 4.2 独立修复;特别关注 fix(lockservice): balance row waiter and range ownership lifetimes #30321、fix(disttae): release subscription state locks before diagnostics #32022、fix(fileservice): correct cache accounting and reclamation #29092 等已注明的分支差异。
- 被替代的条件、无用字段、不可达分支和重复计算应同步删除;不要为了搬测试引入生产层多余抽象。
- Q1:成功、错误、取消、部分初始化、重启/换代后,资源恰好终结一次。
- Q2:等待有明确完成者或可生效的取消/期限;不要仅靠外层 timeout 掩盖内部死锁。
- Q3:常驻、在途、pin、重试和失败样本都纳入增长约束;数量有界不等于内存预算合理。
- 性能需看正常热路径,不只看修复反例;包括锁竞争、分配、I/O 字节数、连接复用、吞吐及 p95/p99。
- 对可选场景要写清前提,不能把理论最坏情况当成所有业务必现的 blocker。
7. 后续评审记录与验收
每个候选由评审人给出 接受完整回迁 / 最小适配 / 已有等价修复 / 不适用 / 延后补证据 之一,并填写:
| 字段 | 必须记录的内容 |
|---|---|
| 原 PR / 根因 | 对应上面的编号与不变量,避免按标题决定 |
| 目标基线 | 回迁时真实 4.2-dev SHA;若用于客户 hotfix,另列客户实际 SHA |
| 决策 / 负责人 | 选用哪些语义、排除哪些改动,以及理由 |
| 依赖与后续修正 | 必要前置、main 后续修复/回退、4.2 独立逻辑 |
| 反例与证据 | 未修复目标上失败、修复目标上通过;若无法重现,明确缺失证据 |
| unhappy / 正常回归 | 取消、超时、断连、并发、关闭、重启及业务正确性 |
| 性能 | 同基线、同资源、同数据的对照,不用一次 noisy 结果作保证 |
| 升级范围 / 兼容性 | CN/TN/Proxy/native、持久格式/任务状态、滚动混版本、是否需重建 |
| 回迁 PR / SHA / 测试链接 | 实际提交和可核验结果,不以原 main CI 替代 |
| 回滚方案 | 代码回滚是否足够;是否已有不可逆状态或需重建/恢复 |
总体验收:
- 逐项完成适用性复核,更新此清单中的接受/排除决定,避免笼统打包。
- 优先组形成边界清楚的回迁 PR;紧密相关生命周期修复联合验证,不夹带无关重构。
- 专项组完成设计、混版本和数据/索引恢复评审后再决定发布批次。
- 每个接受项具备目标 4.2 上的反例、修复后验证和必要的正常业务回归。
- 验证失败、未执行、跳过、通过分别记录;不可把纯文本应用检查写成测试通过。
- 发布前重新比对分支 SHA、等价修复和后续回退,明确最终镜像与升级组件。
- 客户 hotfix 单独按实际版本评估,不自动从本 issue 推导“可仅升级 CN / 可直接上线”。
本 issue 仅建立评审入口;当前未执行任何回迁或发布。
Activity
LeftHandCold commentedon Nov 5, 2026
补充复审:回迁优先级、遗漏项与验收边界(2026-11-05)
结论:本 Issue 的方向基本正确,可以作为回迁评审基线,但不能直接作为整批 cherry-pick、合并或发布批准。建议保留“小修复先行、核心生命周期专项验证、场景项按配置选择”的安排,并补上下面的 ISCP 重试责任缺口及后续修正。
本轮是源码、PR 差异和后续历史复核,没有重新执行 cherry-pick、编译、UT/BVT、集群故障注入或性能测试。原 Main PR 的测试记录不能当成本轮 4.2 验收。以下建议也不是在认定近期所有 OOM、连接中断或索引问题都已找到对应修复。
1. 固定审查基线及状态
a3cfb7551431d7e9d87c33383fb13c44e3757873。ebf03dc42bf25ba00018da019783e1037299d1ae。需要始终区分四件事:语义上值得回迁、文本能够应用、目标 4.2 测试通过、最终组合镜像和升级流程通过。前一项不自动证明后一项。
2. 建议优先推进的九个修复单元
这里的“九项”是工程排期建议,不是九个已经完成 4.2 验收的补丁;#29558 仅包含 nullable UNIQUE 正确性部分。
2.1 #29586 不是只有 MORPC 一个改动
原补丁同时包含 ISCP task-runner 查询的逻辑行读取修正:常量向量的物理长度不能代表 SQL 逻辑行数,需要正确处理零行、一行、多行和 NULL/空值。
回迁记录应把两个修复单元分开写明,并分别带测试。既不要把整个 PR 说成“只改了一行 idle 判断”,也不要拆补丁时无意漏掉另一个仍适用的修复。
此外,已有连接上的长 unary RPC 被 idle GC 回收,与新 backend 在 5 秒内未建立成功是不同机制。仅合入 #29586 不足以关闭所有
backend connection closedIssue,也不能据此认定近期 IVF 连接错误全部解决。2.2 #29558 要修完整性证明,不是全局禁用 nullable UNIQUE
当谓词已经能证明所有索引键分量非 NULL 时,完整且合法的索引路径应继续保留。不能为了避免漏行把所有 nullable UNIQUE 查询一律改为全表扫描。OR 等复合条件必须证明每个可能返回结果的分支都满足完整性要求。
因此应同时验收结果正确性与计划:不安全路径回退,安全路径仍可使用索引;任何必要回退的性能代价都要明示。
3. 一个应补入清单的具体遗漏:#28693
建议把 #28693(
fix(iscp): delegate caller transaction retries,对应 #28675)补入 ISCP 专项。这不是引入新架构,而是纠正“谁有权重试”的责任边界。当前 4.2 的直接证据:
ExecWithResult使用WithDisableIncrStatement().WithTxn(txn),子 SQL 借用调用者事务,不拥有独立语句回滚边界。RegisterJob、UnregisterJob、UnregisterJobsByDBName、重命名及更新 job spec 的入口仍包裹本地retry。retry遇到错误会再次执行回调;它本身不负责回滚借用事务中已经留下的 workspace 写入。所以在需要重试的错误后,helper 继续使用同一事务局部重放,可能复用失败尝试留下的写入,产生重复 transfer intent 等问题。正确责任应是:
Main 的 修复提交 正是按这个边界修改,同时保留自有事务后台操作的通用重试。
最小验收应复用原反例:metadata 读取后 UPDATE 返回
TxnNeedRetry,helper 必须立即返回该错误,而不是再次 UPDATE;再验证正常 register/unregister 幂等性及取消。#28693 不应被描述成 #28176 必然的编译依赖。 它是相邻路径中另一个明确的事务语义缺口,应一起审查,是否拆 PR 可由实际依赖决定。
4. ISCP 不能只孤立回迁 #28176
建议把以下语义放到同一张专项检查表中,复用现有任务 owner 和事务机制,不另外建设状态机:
关于 #31076:Main 的周期水位发布使用
WaitPolicy_FastFail,发生冲突时按既有批次事务责任回滚/释放,留给下一次周期重试;不是把冲突当成功,也不是反复重放借用事务中的单条 SQL。该 PR 还有账户删除及测试等其他修改,不建议整包机械 CP。此处只是要求补查相关生产修正,并没有证明当前每一个账户清理超时都由它造成,也没有把它升级为无条件发布阻断。
升级时必须考虑所有可能接管任务的 CN:仅升级一个 CN,旧 owner 仍可能把状态覆盖回去。旧任务隔离/重建会影响可用性,应给出明确运维方案;不能只添加一个 Stage 字段就声称重复初始化已彻底解决。
5. 核心专项不能机械 CP,但也不应因难度高而长期搁置
这些项是否进入同一维护版本,应以目标 4.2 的验证结果决定。“需要专项验证”不代表“不重要”,特别是客户确实依赖的 HNSW、全文/向量异步索引和 CDC。
6. 已有 4.2 PR 必须单独确认,不能视为已落地
CDC:#32232
本次核对为 OPEN,head
e272ce87e7a8dd5282d948066732b20af27651fc,目标4.2-dev。其方向与本 Issue 的 CDC 缺口匹配:识别实际驱动及包裹后的错误,活跃目标事务不做单语句重试,由外层回滚/重放未确认范围,失败时不推进 watermark;还需要正确处理 batch 所有权交接后的计数。
PR 作者记录了单测、race 和受控目标事务 rollback 的验证,但本轮没有重跑这些测试。其证据边界也应保留:
N:状态记录。因此优先评审该 PR 的目标分支闭环,不再盲目重复搬 #29801。
ODKU:#31979
本次核对为 OPEN,head
6c2d460de5b2a161cbec01229a6df6f322b87c55,目标4.2-dev。不直接 CP #28265 的结论仍然正确,但不能由此忽略 ODKU 多约束、更新顺序及索引一致性。应独立评审 #31979 这份 4.2 适配方案。
特别注意其 protocol 12 / coordinated CN rollout 要求:本地 gate 拒绝低协议 ordered plan,不等于旧二进制自动理解新计划,也不能视为已经证明任意新旧 CN 混跑安全。历史已损坏的基表/索引同样不会自动修复。
7. 条件项、后置项及明确排除项
保留原先按实际业务/配置选择的思路:
COM_STMT_SEND_LONG_DATA分块上传参数时优先,不应泛化成所有 prepared 都受影响。可排后续批次,但不是永久不修:
明确不原样 CP:
8. 建议的实施顺序和最小验收
每个接受项用现有测试与回归设施留下最小可审计记录即可,不建设额外平台:
工程上优先找到已有 owner、事务边界和 Cleanup 路径,确保资源只终结一次、等待可退出、重试有界;同步删除被替代的旧条件,不维护两套同义状态机或校验路径。
最终建议:接受此清单作为回迁工作基线;补齐上述遗漏、配套和证据边界后逐项推进。现在不能宣称整批已验证可发布,也不能将本清单用于证明客户当前事故已经修复。
LeftHandCold commentedon Nov 5, 2026
再次逐路径复审:整体计划可推进,但 #29725 的 4.2 适用性需要更正
对照 上一条复审、原 Issue、Main 合入补丁及目标分支源码后,结论是:
保留“最小语义修复先行、核心专项适配、场景项按需追加”的总体安排,不整批 CP。但首批 #29725 的原理由不能沿用:当前 4.2 并没有 Main 上导致 EPIPE 提前退出 Unlock 的判断。此前把它作为已确认的 4.2 解锁残留修复推荐,判断过宽,这里明确更正。
审查范围与证据边界
4.2-dev@ebf03dc42bf25ba00018da019783e1037299d1ae。d2dab994dd87445b5f5d44a06293bd5e09a1eee9。1. 实质性更正:#29725 不能继续按“4.2 的 Unlock 跳过换绑恢复”列为必修
Main 原问题有明确的前提:在 #29725 的父提交中,
unlockWithContext包含:EPIPE 未被分类为可重试错误,会在到达 allocator 检查之前返回。这段判断见 Main 修复前源码。
但是当前 4.2 的实际路径不同:
unlockWithContext在doUnlock失败后直接调用handleErrorWithContext,没有上述retryRemoteUnlockError提前返回判断。handleErrorWithContext中的retryRemoteLockError只决定是否把错误包装为ErrBackendCannotConnect;它不控制是否查询 allocator。未分类的 EPIPE 同样继续执行 binding 检查。因此:原 Main 的“分类遗漏 → 提前返回 → 未换绑 → closing txn 残留”因果链不能直接套到这个 4.2 基线。
这不表示 #29725 完全没有价值。错误归一化还会影响普通 Lock 返回后是否进入 lockop 的有界重试。如果要回迁,应按这个实际收益单独给出反例与验收;建议改列“错误分类/重试一致性补齐”,不再用已确认解锁残留作为首批必修理由,也不要为复现 Main 问题引入它的整套前置锁重构。
2. 原首批其余八项:继续优先,修复范围保持收敛
pause(false),receiver 等 resume;成功分支随后只切换 first/ready,没有补上恢复责任交接。streamStateMu同步等待 Write,而 writer 退出路径需要同一把锁执行 Close。关键定位:
首次 replay、
idle GC、
FIN/Write、
writer finalizer、
realloc、
Scope Cleanup、
握手、
hinted backfill。
#29586 另含 ISCP task runner 逻辑行数读取修复,仍应独立记录并带测试,避免只看 MORPC 标题而漏掉。三项 MORPC 修复可以分别提交,但组合验收应覆盖同一发送—终结—释放链。
3. ISCP:补充项成立,但区分独立修复与真正配套
新旧 CN 的任务接管限制、旧任务隔离/重建仍需明确。#31237 修好新任务注册,不等于允许旧 executor 随意接管这些新任务。
4. 其余分组与工程边界
几项容易在实施中误判的边界:
5. 调整后的执行结论
最终 review:总体回迁设计合理;修正 #29725 的适用性判断后可作为实施清单推进。当前不具备“这些补丁已在 4.2 验证无风险、可以直接发布”的证据。