Skip to content

Commit 95a3b10

Browse files
authored
[8.2] reading indexUpdateScheduled under the lock guard (#815)
* reading `indexUpdateScheduled` under the lock guard (#813) * reading indexUpdateScheduled under the lock * dont lock twice (cherry picked from commit 1db4e00) * revert removing addVector test from svs tiered (#814) revert removeing addVector test from svs tiered (cherry picked from commit 3513261) * remove multi
1 parent 43b2ed7 commit 95a3b10

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

src/VecSim/algorithms/svs/svs_tiered.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -774,14 +774,17 @@ class TieredSVSIndex : public VecSimTieredIndex<DataType, float> {
774774
VecSimIndexDebugInfo debugInfo() const override {
775775
auto info = Base::debugInfo();
776776

777-
SvsTieredInfo svsTieredInfo = {.trainingTriggerThreshold = this->trainingTriggerThreshold,
778-
.updateTriggerThreshold = this->updateTriggerThreshold,
779-
.updateJobWaitTime = this->updateJobWaitTime,
780-
.indexUpdateScheduled =
781-
static_cast<bool>(this->indexUpdateScheduled.test())};
777+
SvsTieredInfo svsTieredInfo = {
778+
.trainingTriggerThreshold = this->trainingTriggerThreshold,
779+
.updateTriggerThreshold = this->updateTriggerThreshold,
780+
.updateJobWaitTime = this->updateJobWaitTime,
781+
};
782+
{
783+
std::lock_guard<std::mutex> lock(this->updateJobMutex);
784+
svsTieredInfo.indexUpdateScheduled =
785+
this->indexUpdateScheduled.test() == VecSimBool_TRUE;
786+
}
782787
info.tieredInfo.specificTieredBackendInfo.svsTieredInfo = svsTieredInfo;
783-
// prevent parallel updates
784-
std::lock_guard<std::mutex> lock(this->updateJobMutex);
785788
info.tieredInfo.backgroundIndexing =
786789
svsTieredInfo.indexUpdateScheduled && info.tieredInfo.frontendCommonInfo.indexSize > 0
787790
? VecSimBool_TRUE

tests/unit/test_svs_tiered.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,55 @@ TYPED_TEST(SVSTieredIndexTest, addVector) {
539539
ASSERT_LE(expected_mem, tiered_index->getAllocationSize());
540540
}
541541

542+
TYPED_TEST(SVSTieredIndexTest, background_indexing_check) {
543+
// Create TieredSVS index instance with a mock queue.
544+
size_t dim = 2;
545+
constexpr size_t training_th = DEFAULT_BLOCK_SIZE;
546+
constexpr size_t update_th = DEFAULT_BLOCK_SIZE;
547+
SVSParams params = {.type = TypeParam::get_index_type(), .dim = dim, .metric = VecSimMetric_L2};
548+
549+
VecSimParams svs_params = CreateParams(params);
550+
551+
auto mock_thread_pool = tieredIndexMock();
552+
553+
auto tiered_params =
554+
this->CreateTieredSVSParams(svs_params, mock_thread_pool, training_th, update_th);
555+
auto *tiered_index = this->CreateTieredSVSIndex(tiered_params, mock_thread_pool);
556+
ASSERT_INDEX(tiered_index);
557+
558+
mock_thread_pool.init_threads();
559+
560+
for (size_t i = 0; i < training_th; i++) {
561+
TEST_DATA_T vector[dim];
562+
GenerateVector<TEST_DATA_T>(vector, dim, i);
563+
VecSimIndex_AddVector(tiered_index, vector, i);
564+
}
565+
566+
while (tiered_index->debugInfo().tieredInfo.backgroundIndexing != VecSimBool_FALSE) {
567+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
568+
}
569+
570+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), training_th);
571+
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0);
572+
ASSERT_EQ(tiered_index->indexSize(), training_th);
573+
574+
constexpr size_t second_batch = 2500;
575+
576+
for (size_t i = 0; i < second_batch; i++) {
577+
TEST_DATA_T vector[dim];
578+
GenerateVector<TEST_DATA_T>(vector, dim, i);
579+
VecSimIndex_AddVector(tiered_index, vector, training_th + i);
580+
}
581+
582+
while (tiered_index->debugInfo().tieredInfo.backgroundIndexing != VecSimBool_FALSE) {
583+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
584+
}
585+
586+
ASSERT_GT(tiered_index->GetBackendIndex()->indexSize(), training_th + second_batch / update_th);
587+
ASSERT_LT(tiered_index->GetFlatIndex()->indexSize(), update_th);
588+
ASSERT_EQ(tiered_index->indexSize(), second_batch + training_th);
589+
}
590+
542591
TYPED_TEST(SVSTieredIndexTest, insertJob) {
543592
// Create TieredSVS index instance with a mock queue.
544593
size_t dim = 4;

0 commit comments

Comments
 (0)