Skip to content

Commit a9227aa

Browse files
[BUG] Handle uninitialized spann segment reader (chroma-core#4348)
1 parent f2debe0 commit a9227aa

File tree

3 files changed

+43
-33
lines changed

3 files changed

+43
-33
lines changed

rust/worker/chroma_config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ query_service:
5353
blockfile_provider:
5454
arrow:
5555
block_manager_config:
56-
max_block_size_bytes: 16384
56+
max_block_size_bytes: 8388608 # 8MB
5757
block_cache_config:
5858
disk:
5959
dir: "/cache/chroma/query-service/block-cache"
@@ -135,7 +135,7 @@ compaction_service:
135135
blockfile_provider:
136136
arrow:
137137
block_manager_config:
138-
max_block_size_bytes: 16384
138+
max_block_size_bytes: 8388608 # 8MB
139139
block_cache_config:
140140
lru:
141141
capacity: 1000

rust/worker/src/execution/orchestration/spann_knn.rs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use async_trait::async_trait;
22
use chroma_distance::{normalize, DistanceFunction};
3-
use chroma_segment::{distributed_spann::SpannSegmentReader, spann_provider::SpannProvider};
3+
use chroma_segment::{
4+
distributed_spann::{SpannSegmentReader, SpannSegmentReaderError},
5+
spann_provider::SpannProvider,
6+
};
47
use chroma_system::{
58
wrap, ComponentContext, ComponentHandle, Dispatcher, Handler, Orchestrator, TaskMessage,
69
TaskResult,
@@ -131,25 +134,6 @@ impl SpannKnnOrchestrator {
131134
self.send(task, ctx).await;
132135
}
133136
}
134-
135-
async fn set_spann_reader(&mut self, ctx: &ComponentContext<Self>) {
136-
let reader_res = SpannSegmentReader::from_segment(
137-
&self.collection,
138-
&self.knn_filter_output.vector_segment,
139-
&self.spann_provider.blockfile_provider,
140-
&self.spann_provider.hnsw_provider,
141-
self.knn_filter_output.dimension,
142-
)
143-
.await;
144-
let reader = match self.ok_or_terminate(reader_res, ctx).await {
145-
Some(reader) => reader,
146-
None => {
147-
tracing::error!("Failed to create SpannSegmentReader");
148-
return;
149-
}
150-
};
151-
self.spann_reader = Some(reader);
152-
}
153137
}
154138

155139
#[async_trait]
@@ -176,16 +160,42 @@ impl Orchestrator for SpannKnnOrchestrator {
176160
ctx.receiver(),
177161
);
178162
tasks.push(knn_log_task);
179-
self.set_spann_reader(ctx).await;
180-
let head_search_task = wrap(
181-
Box::new(self.head_search.clone()),
182-
SpannCentersSearchInput {
183-
reader: self.spann_reader.clone(),
184-
normalized_query: self.normalized_query_emb.clone(),
163+
let reader_res = SpannSegmentReader::from_segment(
164+
&self.collection,
165+
&self.knn_filter_output.vector_segment,
166+
&self.spann_provider.blockfile_provider,
167+
&self.spann_provider.hnsw_provider,
168+
self.knn_filter_output.dimension,
169+
)
170+
.await;
171+
match reader_res {
172+
Ok(reader) => {
173+
self.spann_reader = Some(reader.clone());
174+
// Spawn the centers search task if reader is found.
175+
let head_search_task = wrap(
176+
Box::new(self.head_search.clone()),
177+
SpannCentersSearchInput {
178+
reader: Some(reader),
179+
normalized_query: self.normalized_query_emb.clone(),
180+
},
181+
ctx.receiver(),
182+
);
183+
tasks.push(head_search_task);
184+
}
185+
Err(e) => match e {
186+
// Segment uninited means no compaction yet.
187+
SpannSegmentReaderError::UninitializedSegment => {
188+
// If the segment is uninitialized, we can skip the head search.
189+
self.spann_reader = None;
190+
self.heads_searched = true;
191+
}
192+
_ => {
193+
let _: Option<()> = self
194+
.ok_or_terminate(Err(KnnError::SpannSegmentReaderCreationError(e)), ctx)
195+
.await;
196+
}
185197
},
186-
ctx.receiver(),
187-
);
188-
tasks.push(head_search_task);
198+
}
189199

190200
let prefetch_task = wrap(
191201
Box::new(PrefetchSegmentOperator::new()),

rust/worker/tilt_config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ query_service:
5252
blockfile_provider:
5353
arrow:
5454
block_manager_config:
55-
max_block_size_bytes: 16384
55+
max_block_size_bytes: 8388608 # 8MB
5656
block_cache_config:
5757
disk:
5858
dir: "/cache/chroma/query-service/block-cache"
@@ -138,7 +138,7 @@ compaction_service:
138138
blockfile_provider:
139139
arrow:
140140
block_manager_config:
141-
max_block_size_bytes: 16384
141+
max_block_size_bytes: 8388608 # 8MB
142142
block_cache_config:
143143
lru:
144144
capacity: 1000

0 commit comments

Comments
 (0)