fix(delivery): 删除通知只登记 KAFKA:msg,schd 不再发 tombstone(ACM2-87)

- FdelProcessor 移除 schd TOMBSTONE,仅保留 msg 删除通知(C-9)
- HistorySweepJob 补发的清退通知由 schd TOMBSTONE 改为 msg 删除通知
- msg value 形态沿用现状(deleted:true JSON),待 Q5 定稿不改成 null tombstone
- 同步修订 FdelAndAdftProcessorTest / HistorySweepJobTest / HistorySweepPurgePgTest 断言
This commit is contained in:
windyboy
2026-09-21 12:31:02 +08:00
parent df087c7933
commit a1c56f546f
5 changed files with 27 additions and 38 deletions
@@ -68,7 +68,7 @@ class HistorySweepJob(
val toPurge = candidates.filter { it.flid in archivedFlids }
// 归档与删除之间主泵可能已写入同一 FLID:进锁事务后按 (FLID, STATE_VERSION) 复查,
// 仍合格才登记 tombstone 并删除;事件与删除同事务提交或回滚(D1、US-14 AC4)。
// 仍合格才登记删除通知并删除;事件与删除同事务提交或回滚(D1、US-14 AC4)。
var purged = 0
txManager.inTransaction {
lock.lock()
@@ -78,7 +78,7 @@ class HistorySweepJob(
// 从没收到过 FDEL、被这里直接清掉的航班,删除前补发一次通知,否则下游一直以为它还在
val preDelete = rechecked.filter { it.wasNeverFdel }
if (preDelete.isNotEmpty()) {
msgEvents.insertAll(preDelete.map { tombstone(it, now) })
msgEvents.insertAll(preDelete.map { deletionNotice(it, now) })
}
purged = flightState.purgeArchived(rechecked)
}
@@ -86,10 +86,10 @@ class HistorySweepJob(
return SweepOutcome(candidates.size, archivedFlids.size, purged, snapLogPurged)
}
private fun tombstone(candidate: HistoryCandidate, createdAt: Instant) = MsgEvent(
target = Targets.KAFKA_SCHD,
/** C-9:删除通知只走 KAFKA:msgvalue 形态("deleted":true 的 JSON)沿用现状,待 Q5 定稿。 */
private fun deletionNotice(candidate: HistoryCandidate, createdAt: Instant) = MsgEvent(
target = Targets.KAFKA_MSG,
partitionKey = candidate.flid,
eventType = EventType.TOMBSTONE,
stateVersion = candidate.stateVersion,
payloadJson = """{"flid":"${candidate.flid}","stateVersion":${candidate.stateVersion},"deleted":true}""",
createdAt = createdAt,
@@ -86,20 +86,8 @@ class FdelProcessor(
val createdAt = clock.instant()
msgEvents.insertAll(
listOf(
MsgEvent(
target = Targets.KAFKA_SCHD,
partitionKey = payload.flid,
eventType = EventType.TOMBSTONE,
stateVersion = current?.stateVersion ?: 0L,
payloadJson = mapper.writeValueAsString(
mapOf(
"flid" to payload.flid,
"stateVersion" to (current?.stateVersion ?: 0L),
"deleted" to true,
),
),
createdAt = createdAt,
),
// C-9:删除通知只走 KAFKA:msgschd 不再发 tombstone
// value 形态("deleted":true 的 JSON)沿用现状,待 Q5 定稿
MsgEvent(
target = Targets.KAFKA_MSG,
partitionKey = payload.flid,