airborne12 opened a new pull request, #68674: URL: https://github.com/apache/doris/pull/68674
### 问题 轻量 Schema Change 路径下执行 `DROP INDEX`,若同一分区上还有未完成的 IndexChangeJob(例如前序 DROP/CREATE INDEX 的后台任务尚未结束),语句会返回错误 `partition xxx has been built specified index`,但索引元数据已经被删除,`SHOW INDEX` 看不到该索引。客户端无法根据返回值判断 DDL 是否生效(开启/未开启 Row Binlog 均可复现,Cloud 与非 Cloud 通用)。 复现:新建库表,`CREATE INDEX iv ... INVERTED; DROP INDEX iv; CREATE INDEX ng ... NGRAM_BF; DROP INDEX ng;` 连续快速执行,最后一条 DROP 报错,随后 SHOW INDEX 为空。 ### 根因 `SchemaChangeHandler#modifyTableLightSchemaChange` 中 DROP INDEX 先调用 `updateBaseIndexSchema` 修改元数据并写 EditLog,之后才在 `buildOrDeleteTableInvertedIndices` 里通过 `hasIndexChangeJobOnPartition` 做冲突检查;检查失败抛异常时元数据不会回滚。 ### 改动 - 在修改元数据/写 EditLog 之前(仅非 replay 的 DROP INDEX),新增 `checkNoIndexChangeJobOnPartitions` 对所有分区先做冲突检查,冲突时直接拒绝,表元数据保持不变,错误信息与原来一致。 - 新增 UT `SchemaChangeHandlerTest#testCheckNoIndexChangeJobOnPartitions`:无任务时通过;存在未完成任务时抛错;任务 FINISHED 后再次通过。 - 说明:`buildOrDeleteTableInvertedIndices` 内保留原有检查作为兜底,不改变其行为;检查与任务登记之间在 FE 层的并发窗口未额外加锁(DDL 已在表写锁下执行)。 ### 测试 - 未能运行 UT:本 worktree 的 thrift 编译器为 0.16.0,而 libthrift 需要 0.24.0,`run-fe-ut.sh` 在 fe-thrift 版本检查处失败(环境问题,非代码问题)。代码与新增测试仅经人工审阅,尚未编译验证,请 CI 确认。 - 未做端到端手工复现验证。 Behavior changed: Yes(DROP INDEX 因冲突失败时不再遗留元数据变更) Does this need documentation: No 🤖 Generated with [Claude Code](https://claude.com/claude-code) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
