fix: 心跳复活节点、inflight 超时重发

1. handleClusterToken:心跳到达时把发送方(前驱)标记为 alive。
   之前 forwardToNext 超时把节点 MarkOffline 后就再无途径恢复,
   即使下一个心跳证明它活着。心跳是 leader 侧纠正误判的唯一入口。

2. forwardToNext:遍历完所有后继才返回,不要提前 inflight.clear()。
   保留 inflight 状态,让 WatchTokenLoss 超时后 StartRing 重发,
   重发时 AliveSuccessor 会重新计算,心跳刚复活的节点就能被选中。

这两处补丁一起提交,形成完整的存活复活闭环。
This commit is contained in:
JianFeeeee
2026-08-28 16:32:51 +08:00
parent 15b1dcce8f
commit f9c2e9476a
2 changed files with 39 additions and 1 deletions

View File

@ -155,7 +155,9 @@ func (e *Engine) forwardToNext(ctx context.Context, tk *Token) error {
}
// Non-leader neighbor death: continue to the next recipient.
}
e.inflight.clear()
// 全环遍历完毕,所有后继都不可达(或已全部尝试过)。
// 保持 inflight不清空让 WatchTokenLoss 超时后重发。
// 重发时 AliveSuccessor 重新计算,可能已被心跳复活。
return nil
}