线上现象:货源查询任务 26402/26400(归属 server-121)在归属机正常推进, 却被 server-110 判为「结果生成失败」,错误为「该任务已绑定到另一台服务实例处理」。 两个缺陷叠加: 1. 两台实例共用一个 RocketMQ consumer group,dispatch 消息被轮询投递; worker 对"PENDING + owner 不匹配"的 job 选择本地抢跑,模块层 ensureTaskOwnedByCurrentInstance 直接抛 TaskOwnerMismatchException, 异常落进通用 catch 被当成生成失败,5 次抢跑即耗尽 retryCount 并终态失败。 2. runPendingJobs 双重 claim:claimRunnableJobsForOwner 已把 job 翻成 RUNNING, 随后又走 claimRunning(条件 PENDING/FAILED)必然失败 → job 被静默丢弃, 归属机的定时兜底从未真正生效。 修复: - worker:非归属实例一律跳过 owner-scoped job;抽出 processClaimed 供已持有 claim 的调用方使用;processInternal 单独捕获 TaskOwnerMismatchException, 只 deferRunning 退回 PENDING,不计入重试。 - TaskFileJobLocalDispatcher 新增 dispatchClaimed。 - dispatch 事件带上 owner,coordinator 按归属路由:本机 owner 直接本地派发不发 MQ, 他机 owner 不发不跑交由归属机轮询接手,owner 为空维持原有 MQ 行为。 - 新增 owner 路由回归测试两组,回滚配合"本地抢跑"的旧断言。 同时提交此前工作区内已随 JAR 上线的 backend-java 改动:SimilarAsin 解析载荷 groups 内嵌 items(Python 旧链路兼容)与 chunk 类型不匹配跳过、 PermissionMenuSchemaInitializer 与 V103 两级菜单分组迁移、相关测试。
This commit is contained in:
@@ -106,8 +106,17 @@ class ExplainIndexAuditDocTest {
|
||||
assertTrue(audit.contains("不做 DDL") || audit.contains("本任务无 DDL")
|
||||
|| audit.contains("不新增索引") || audit.contains("只审计"),
|
||||
"审计文档明确本任务不做 DDL");
|
||||
assertFalse(audit.contains("ALTER TABLE"),
|
||||
"审计文档不包含 ALTER TABLE(DDL 属于后续任务 116)");
|
||||
// 任务 116 落地 V101 索引后,审计文档会把 ALTER TABLE 作为候选索引的
|
||||
// 回滚说明引用。审计任务自身依然不执行 DDL——判定口径改为「ALTER TABLE
|
||||
// 只能出现在候选/回滚等说明性上下文」,而不是文档里不得出现该字符串。
|
||||
for (String line : audit.split("\r?\n")) {
|
||||
if (!line.contains("ALTER TABLE")) {
|
||||
continue;
|
||||
}
|
||||
assertTrue(line.contains("回滚") || line.contains("候选") || line.contains("建议")
|
||||
|| line.contains("风险") || line.trim().startsWith(">"),
|
||||
"审计文档中的 ALTER TABLE 必须是候选/回滚说明,实际行:" + line);
|
||||
}
|
||||
assertTrue(spec.contains("只读") || spec.contains("巡检"),
|
||||
"12 spec 巡检报表模式与审计文档对应");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user