MOD-15579 Lazy initialization of the shared SVS thread pool#969
Open
meiravgri wants to merge 2 commits into
Open
MOD-15579 Lazy initialization of the shared SVS thread pool#969meiravgri wants to merge 2 commits into
meiravgri wants to merge 2 commits into
Conversation
🛡️ Jit Security Scan Results✅ No security findings were detected in this PR
Security scan by Jit
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## meiravg_svs_thpool_alloactor #969 +/- ##
================================================================
- Coverage 96.97% 96.93% -0.04%
================================================================
Files 130 130
Lines 7829 7801 -28
================================================================
- Hits 7592 7562 -30
- Misses 237 239 +2 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Open
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Make initialization of the shared SVS thread pool lazy: OS worker threads are spawned only when the first SVS index is created, not when
VecSim_UpdateThreadPoolSizeis called. This eliminates the cost of pre-allocated SVS workers in deployments that configure RediSearch workers but never create an SVS index (today, every Redis withWORKERS=Nconfigured spawnsN-1SVS worker threads at module init regardless of whether SVS is ever used).The change extends the existing deferred-resize protocol to cover a second "safe point".
VecSimSVSThreadPoolImpl::resize()now defers application in two cases:onIndexAttached()(lazy thread spawn).pending_jobs_ > 0) → recorded; applied whenendScheduledJob()drops the counter to 0 (existing behaviour).resize_locked().The two deferral cases share
deferred_size_and never overlap (no jobs can be in flight before the first index attaches). One new gate field,has_attached_index_, distinguishes the two states. Set on the firstonIndexAttached()call from the per-indexVecSimSVSThreadPoolctor.A test-only
resetForTest()hook (underBUILD_TESTS) restores the singleton to a clean baseline by releasing the slots vector capacity and clearing the new gate; intended for unit tests that need to observe lazy semantics in a process where prior tests may have already attached indexes.VecSim_UpdateThreadPoolSizecontinues to set the write mode (InPlace/Async) eagerly — only the SVS pool sizing is now deferred. The C API surface is unchanged.RediSearch integration impact: none required —
VecSim_UpdateThreadPoolSize(N)is still the single entry point for both module init andCONFIG SET search-workers M. Pre-index calls now just record the size; post-index calls behave exactly as before.Main objects this PR modified
VecSimSVSThreadPoolImpl::resize()— now lazy until first index attaches.VecSimSVSThreadPoolImpl::onIndexAttached()— new entry point called from per-indexVecSimSVSThreadPoolctor; flipshas_attached_index_and applies any deferred size.VecSimSVSThreadPoolImpl::has_attached_index_— new member field gating spawn vs. defer.VecSimSVSThreadPoolImpl::resetForTest()— newBUILD_TESTS-only hook.VecSim_UpdateThreadPoolSize()— comment updated; behaviour now lazy via the newresize()semantics.Tests
SVSTest.ThreadPoolLazyInit(new) — verifiesVecSim_UpdateThreadPoolSizedoes not allocate worker threads before any SVS index exists, and that the first SVS index creation triggers the deferred spawn at the previously requested size.SVSThreadPoolTest.UpdateThreadPoolSizeModeTransitions— rewritten to validate the lazy → eager transition (size stays at 1 until an index attaches; subsequent transitions are immediate).SVSThreadPoolTestfixture —SetUp()callsonIndexAttached()so the existing pool-isolation tests retain eagerresize()semantics.SVSTest.NumThreadsParamIgnored— callsonIndexAttached()upfront for the same reason.SVSTest.debugInfoGlobalMemoryEqualsSharedSVSThreadPoolMemory—ASSERT_GTon global memory moved to afterCreateNewIndex(the lazy spawn fires there).Mark if applicable
Note
Medium Risk
Changes shared SVS thread-pool resizing semantics and introduces a new lazy-init/deferral state, which can affect concurrency and job scheduling behavior if edge cases were missed. Unit tests were updated/added, but threading/resource-management changes still carry moderate risk.
Overview
Defers creation of SVS shared pool worker threads until the first SVS index attaches:
VecSimSVSThreadPoolImpl::resize()now records requested sizes pre-index and applies them inonIndexAttached(), while keeping the existing defer shrink while jobs are in flight behavior.Adds a
BUILD_TESTS-onlyresetForTest()to clear singleton state, updatesVecSim_UpdateThreadPoolSize()documentation to reflect lazy spawning, and adjusts/extends unit tests to validate the lazy→eager transition and global-memory reporting (including a newThreadPoolLazyInittest).Reviewed by Cursor Bugbot for commit 7bc3e24. Bugbot is set up for automated code reviews on this repo. Configure here.