[C API] Add cancellation-poll callback to `svs_search_params`
维护者通常 5 天内回复
还没有人认领这个 Issue。
评估
调研方向
Start by locating the svs_search_params and svs_index_search_topk declarations and implementation, then inspect the existing tests under bindings/c/tests/. Define the callback and cancellation error behavior at the API boundary, document the polling cadence in the header, and add tests for cancellation before start, cancellation mid-search, and no cancellation. Finish by checking the null-callback overhead against the stated benchmark.
由索引模型根据 Issue 内容生成。
描述
Summary
svs_index_search_topk at pin 5717f6855a73a9ab7524748e2a10a57ed865737d
takes an svs_search_params_h but exposes no way for the caller to
interrupt a running search. The search completes fully regardless of
whether the caller wants to abandon it. This ask adds an optional
is_cancelled_fn(userdata) -> bool callback to svs_search_params;
SVS polls it at appropriate points inside the search loop and returns
partial results plus an SVS_ERROR_CANCELLED code when the callback
returns true.
Motivation
valkey-search integrates SVS as ALGORITHM SVS_VAMANA and must honour
client-side query timeouts and shutdown signals. Its existing HNSW path
polls a cancel::Token on every visited node via
hnswlib::BaseCancellationFunctor (see
valkey-io/valkey-search:src/indexes/vector_hnsw.cc:322-329), so a
canceled query returns promptly with absl::CancelledError and the
client sees -ERR Search timed out. Without an SVS equivalent, SVS
searches on large indexes run to completion after the timeout fires
and the module returns the (now-stale) results to a client that has
long since disconnected. Two user-facing consequences:
- Client timeouts don't fire mid-search. On large indexes with modest
search_window_sizethis can stretch a query well past the
client's configured timeout. - Server shutdown is delayed by the tail of any in-flight search.
Proposed change
Add a callback field to svs_search_params. Version-gate via
SVS_C_API_VERSION so callers can compile against either the current
or the extended layout.
typedef bool (*svs_is_cancelled_fn)(void* userdata);
SVS_API bool svs_search_params_set_cancel_callback(
svs_search_params_h params,
svs_is_cancelled_fn fn, /* NULL to disable */
void* userdata, /* opaque, passed to fn */
svs_error_h out_err);
Semantics:
- If a callback is set and returns
trueduring a search, SVS aborts
the current search and returns whatever candidates it has already
collected insvs_search_results_t. The out-error carries
SVS_ERROR_CANCELLEDso the caller can distinguish a cancel from
an I/O or state error. - If no callback is set (default), current behavior is preserved.
- The callback may be invoked from any thread SVS uses for the
search (in valkey-search's case, the calling reader thread with
our customsize()=1threadpool). It must be reentrant-safe. - SVS should poll the callback at a reasonable granularity --
matching HNSW's per-visited-node poll would be ideal but per-batch
is acceptable if per-node adds measurable overhead. Document the
cadence.
Acceptance criteria
svs_search_params_set_cancel_callbacksets a callback that SVS
polls duringsvs_index_search_topk.- On callback returning
true, the call returns non-zero
results.n_results(partial) when at least one candidate was
found, or zero if none were found;svs_error_get_code(err)
returnsSVS_ERROR_CANCELLED. - On callback returning
falsethroughout, results are identical
to the non-cancelable path. - On callback being NULL / unset, behavior identical to today's
API. - Poll cadence documented in the header (per-node or per-batch).
- Unit tests in
bindings/c/tests/cover: cancel-before-start
(returns empty + cancelled code), cancel-mid-search (returns
partial + cancelled code), no-cancel (identical to baseline). - Cost benchmark: null-callback overhead vs. baseline is
below 1% p50 on the standardbindings/c/testsrecall dataset
at k=10.
Non-goals
- Preemptive thread cancellation. Cooperative poll is sufficient.
- Cancellation on
svs_index_build_dynamic,svs_index_load_dynamic,
orsvs_index_dynamic_add_points. Search is the load-bearing path;
the mutating ops are short enough that adding cancellation is not
worth the API surface.
- 主要语言
- C++
- 星标
- 241
- 派生
- 48
- 平均合并
- 4 天 21 小时
- 30 天内合并 PR
- 11
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
intel/ScalableVectorSearch 的其他 Issue
-
难度 1/5 1 小时以内 新手友好度 88/100
intel/ScalableVectorSearch#356 ·
维护者通常 5 天内回复
-
难度 4/5 3-5 天 新手友好度 42/100
intel/ScalableVectorSearch#469 ·
维护者通常 5 天内回复
-
enhancement
难度 3/5 1-2 天 新手友好度 32/100
intel/ScalableVectorSearch#460 ·
维护者通常 5 天内回复
-
难度 4/5 3-5 天 新手友好度 55/100
intel/ScalableVectorSearch#438 ·
维护者通常 5 天内回复
-
CI: tier the test matrix into PR / main / nightly to cut Actions minutes可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 5/5 一周以上 新手友好度 32/100
intel/ScalableVectorSearch#432 · 1 条评论 ·
维护者通常 5 天内回复
查看 intel/ScalableVectorSearch 的全部 Issue
相似的 Issue
-
runtime: lf_f128_mod is documented as fmodq (truncating) but implements floor-based modulo; unused未关闭internal correctness low priority rt_lib
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 87/100
-
PriorityNotificationQueue::wakeUpAll() loses the wake-up for a thread that is not waiting yet可能已有人在做 @matejk 今天认领。 未关闭bug
难度 2/5 1-3 小时 新手友好度 78/100
pocoproject/poco#5674 ·
维护者通常 2 天内回复
-
bug docs GUI
难度 2/5 1-3 小时 新手友好度 62/100
sonic-pi-net/sonic-pi#3609 ·
-
bug
难度 2/5 1-3 小时 新手友好度 70/100
SanderMertens/flecs#2395 ·
维护者通常 1 天内回复