From c687f95260596897b55e62be9ae56353fca3b1ba Mon Sep 17 00:00:00 2001 From: overtrue Date: Sat, 22 Aug 2026 12:02:56 +0800 Subject: [PATCH] fix(ecstore): preserve active ILM source journals --- crates/ecstore/src/core/pools.rs | 7 ++++++- crates/ecstore/src/store/init.rs | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/ecstore/src/core/pools.rs b/crates/ecstore/src/core/pools.rs index 1a86a3356..71586cfc7 100644 --- a/crates/ecstore/src/core/pools.rs +++ b/crates/ecstore/src/core/pools.rs @@ -5501,6 +5501,7 @@ impl ECStore { let stage = if terminal { "terminal" } else { "progress" }; let record = validate_durable_ilm_record(path, data) .map_err(|err| Error::other(format!("{stage} durable ILM record is invalid at path `{path}`: {err}")))?; + let active_source_pool_indices = active_runs.iter().map(|(pool_idx, _)| *pool_idx).collect::>(); let mut terminal_target_pool_indices = Vec::new(); for (source_pool_idx, run_token) in active_runs { let receipt_path = decommission_durable_ilm_receipt_path(&run_token, path, record.id_kind, &record.id); @@ -5511,7 +5512,11 @@ impl ECStore { .advance_durable_ilm_decommission_receipt(pool_idx, &receipt_path, &record, terminal) .await?; receipt_found |= found; - if terminal && found && !terminal_target_pool_indices.contains(&pool_idx) { + if terminal + && found + && !active_source_pool_indices.contains(&pool_idx) + && !terminal_target_pool_indices.contains(&pool_idx) + { terminal_target_pool_indices.push(pool_idx); } } diff --git a/crates/ecstore/src/store/init.rs b/crates/ecstore/src/store/init.rs index ffd91a2a0..20ea839d3 100644 --- a/crates/ecstore/src/store/init.rs +++ b/crates/ecstore/src/store/init.rs @@ -3287,6 +3287,10 @@ mod tests { .persist_decommission_durable_ilm_receipt_for_test(0, 2, &path, &record, false) .await .expect("source pool zero receipt should persist on the target"); + store + .persist_decommission_durable_ilm_receipt_for_test(0, 1, &path, &record, false) + .await + .expect("source pool zero receipt may reach another active source first"); let source_one_receipt = store .persist_decommission_durable_ilm_receipt_for_test(1, 2, &path, &record, false) .await