From be1d7a6421b09146c0ef132e862110c12cdb161f Mon Sep 17 00:00:00 2001 From: Nadav Gov-Ari Date: Tue, 23 Jun 2026 11:14:08 -0400 Subject: [PATCH] Use only retiring nodes when no ready nodes, rather than all not ready --- .../src/indexing_scheduler/mod.rs | 15 +++++++++++++-- .../src/codegen/quickwit/quickwit.search.rs | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/quickwit/quickwit-control-plane/src/indexing_scheduler/mod.rs b/quickwit/quickwit-control-plane/src/indexing_scheduler/mod.rs index c4b01ba2f3e..d8d422cbc58 100644 --- a/quickwit/quickwit-control-plane/src/indexing_scheduler/mod.rs +++ b/quickwit/quickwit-control-plane/src/indexing_scheduler/mod.rs @@ -394,10 +394,11 @@ impl IndexingScheduler { } fn select_available_indexers_for_scheduling(&self) -> Vec { - let (ready, not_ready): (Vec, Vec) = self + let (ready, retiring): (Vec, Vec) = self .indexer_pool .values() .into_iter() + .filter(|indexer| indexer.ingester_status.accepts_write_requests()) .partition(|indexer| indexer.ingester_status == IngesterStatus::Ready); if ready.is_empty() { @@ -406,7 +407,7 @@ impl IndexingScheduler { warn!( "no ready indexer available, falling back to retiring indexers for shard draining" ); - not_ready + retiring } else { ready } @@ -1180,8 +1181,18 @@ mod tests { let indexer_pool = IndexerPool::default(); let retiring_1 = mock_indexer_node_info("indexer-retiring-1", IngesterStatus::Retiring); let retiring_2 = mock_indexer_node_info("indexer-retiring-2", IngesterStatus::Retiring); + let decommissioned_1 = + mock_indexer_node_info("indexer-decommissioned-1", IngesterStatus::Decommissioned); + let decommissioning_1 = + mock_indexer_node_info("indexer-decommissioning-1", IngesterStatus::Decommissioning); + let initializing_1 = + mock_indexer_node_info("indexer-initializing-1", IngesterStatus::Initializing); + indexer_pool.insert(retiring_1.node_id.clone(), retiring_1); indexer_pool.insert(retiring_2.node_id.clone(), retiring_2); + indexer_pool.insert(decommissioned_1.node_id.clone(), decommissioned_1); + indexer_pool.insert(decommissioning_1.node_id.clone(), decommissioning_1); + indexer_pool.insert(initializing_1.node_id.clone(), initializing_1); let scheduler = IndexingScheduler::new( "test-cluster".to_string(), diff --git a/quickwit/quickwit-proto/src/codegen/quickwit/quickwit.search.rs b/quickwit/quickwit-proto/src/codegen/quickwit/quickwit.search.rs index 118cd01edb9..a9109c1ad11 100644 --- a/quickwit/quickwit-proto/src/codegen/quickwit/quickwit.search.rs +++ b/quickwit/quickwit-proto/src/codegen/quickwit/quickwit.search.rs @@ -455,7 +455,7 @@ pub struct RootResourceStats { /// the first phase (running aggregation, and identifying the doc address of the top-k hits we should return) /// and the second phase (fetch documents). /// - /// If there are no top-k hits, the second phase . + /// If there are no top-k hits, the second phase is skipped. #[prost(uint64, tag = "8")] pub root_wall_time_microsecs: u64, }