fix(ecstore): avoid terminal receipt shadowing

This commit is contained in:
overtrue
2026-08-22 03:57:03 +08:00
parent acffa7511f
commit 1fec344f43
+11 -7
View File
@@ -958,20 +958,24 @@ fn merge_decommission_durable_ilm_receipts(
incoming.checkpoint.clone() incoming.checkpoint.clone()
}; };
let terminal_checkpoint = match (&existing.terminal_checkpoint, &incoming.terminal_checkpoint) { let terminal_checkpoint = match (&existing.terminal_checkpoint, &incoming.terminal_checkpoint) {
(Some(existing), Some(incoming)) if existing == incoming => Some(existing.clone()), (Some(existing_terminal), Some(incoming_terminal)) if existing_terminal == incoming_terminal => {
(Some(existing), Some(incoming)) if incoming.validate_successor(existing).is_ok() => Some(existing.clone()), Some(existing_terminal.clone())
(Some(existing), Some(incoming)) => { }
existing.validate_successor(incoming).map_err(|err| { (Some(existing_terminal), Some(incoming_terminal)) if incoming_terminal.validate_successor(existing_terminal).is_ok() => {
Some(existing_terminal.clone())
}
(Some(existing_terminal), Some(incoming_terminal)) => {
existing_terminal.validate_successor(incoming_terminal).map_err(|err| {
Error::other(format!( Error::other(format!(
"durable ILM receipt terminal checkpoint conflict for source path `{}` {}: {err}", "durable ILM receipt terminal checkpoint conflict for source path `{}` {}: {err}",
existing.source_path, existing.source_path,
existing.context() existing.context()
)) ))
})?; })?;
Some(incoming.clone()) Some(incoming_terminal.clone())
} }
(Some(existing), None) => Some(existing.clone()), (Some(existing_terminal), None) => Some(existing_terminal.clone()),
(None, Some(incoming)) => Some(incoming.clone()), (None, Some(incoming_terminal)) => Some(incoming_terminal.clone()),
(None, None) => None, (None, None) => None,
}; };
let merged = DecommissionDurableIlmReceipt { let merged = DecommissionDurableIlmReceipt {