From 67ce9a5f6d8e290899c429c3caaf77b7d49642ee Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 28 Oct 2026 00:34:45 -0700 Subject: [PATCH] vector: expose index names in segment planning (#12150) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vector: named_segment_fragments carries the logical index name Sharded builds create one named index per shard and a with_index_segments scan must not mix names — a fanout planner needs the name to group tasks, so expose it alongside uuid and coverage. --- seaweed-vector/crates/core/src/segments.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/seaweed-vector/crates/core/src/segments.rs b/seaweed-vector/crates/core/src/segments.rs index e7767efafd..6b83f14344 100644 --- a/seaweed-vector/crates/core/src/segments.rs +++ b/seaweed-vector/crates/core/src/segments.rs @@ -23,6 +23,20 @@ pub async fn segment_fragments( dataset: &Dataset, field: &str, ) -> Result> { + Ok(named_segment_fragments(dataset, field) + .await? + .into_iter() + .map(|(id, _, b)| (id, b)) + .collect()) +} + +/// Like `segment_fragments` but carries the logical index name — sharded +/// builds create one named index per shard, and a `with_index_segments` +/// scan must not mix names, so a fanout planner groups by name. +pub async fn named_segment_fragments( + dataset: &Dataset, + field: &str, +) -> Result> { let field = dataset .schema() .field(field) @@ -33,7 +47,11 @@ pub async fn segment_fragments( .await? .iter() .filter(|i| i.fields == [field.id]) - .filter_map(|i| i.fragment_bitmap.clone().map(|b| (i.uuid, b & &live))) + .filter_map(|i| { + i.fragment_bitmap + .clone() + .map(|b| (i.uuid, i.name.clone(), b & &live)) + }) .collect()) }