Skip to content

Commit 11ea88d

Browse files
authored
[MOD-12346] Remove main-thread graph repair from SVS delete operations (#831)
* remove consolidate from delete * indexSize -> includes marked deleted indexLabelCount -> only valid vectors * fix flow tests * Revert "fix flow tests" This reverts commit 831c08c. * Revert "indexSize -> includes marked deleted" This reverts commit 82758c2. * TO REVERT: bump to main SVS * BUMP TO ib/buffer * SVS v0.0.11: take updated bunaries and SVS public * Reapply "indexSize -> includes marked deleted" This reverts commit 3ae28cd. * Reapply "fix flow tests" This reverts commit 45462d4.
1 parent 23c5b4b commit 11ea88d

File tree

5 files changed

+84
-65
lines changed

5 files changed

+84
-65
lines changed

src/VecSim/algorithms/svs/svs.h

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
240240
}
241241

242242
int deleteVectorsImpl(const labelType *labels, size_t n) {
243-
if (indexSize() == 0) {
243+
if (indexLabelCount() == 0) {
244244
return 0;
245245
}
246246

@@ -280,22 +280,13 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
280280
return;
281281

282282
// SVS index instance should not be empty
283-
if (indexSize() == 0) {
283+
if (indexLabelCount() == 0) {
284284
this->impl_.reset();
285285
num_marked_deleted = 0;
286286
return;
287287
}
288288

289289
num_marked_deleted += n;
290-
// consolidate index if number of changes bigger than 50% of index size
291-
const float consolidation_threshold = .5f;
292-
// indexSize() should not be 0 see above lines
293-
assert(indexSize() > 0);
294-
// Note: if this function is called after deleteVectorsImpl, indexSize is already updated
295-
if (static_cast<float>(num_marked_deleted) / indexSize() > consolidation_threshold) {
296-
impl_->consolidate();
297-
num_marked_deleted = 0;
298-
}
299290
}
300291

301292
bool isTwoLevelLVQ(const VecSimSvsQuantBits &qbits) {
@@ -330,7 +321,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
330321

331322
~SVSIndex() = default;
332323

333-
size_t indexSize() const override { return impl_ ? impl_->size() : 0; }
324+
size_t indexSize() const override { return indexStorageSize(); }
334325

335326
size_t indexStorageSize() const override { return impl_ ? impl_->view_data().size() : 0; }
336327

@@ -342,7 +333,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
342333
if constexpr (isMulti) {
343334
return impl_ ? impl_->labelcount() : 0;
344335
} else {
345-
return indexSize();
336+
return impl_ ? impl_->size() : 0;
346337
}
347338
}
348339

@@ -524,7 +515,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
524515
VecSimQueryParams *queryParams) const override {
525516
auto rep = new VecSimQueryReply(this->allocator);
526517
this->lastMode = STANDARD_KNN;
527-
if (k == 0 || this->indexSize() == 0) {
518+
if (k == 0 || this->indexLabelCount() == 0) {
528519
return rep;
529520
}
530521

@@ -569,7 +560,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
569560
VecSimQueryParams *queryParams) const override {
570561
auto rep = new VecSimQueryReply(this->allocator);
571562
this->lastMode = RANGE_QUERY;
572-
if (radius == 0 || this->indexSize() == 0) {
563+
if (radius == 0 || this->indexLabelCount() == 0) {
573564
return rep;
574565
}
575566

@@ -642,7 +633,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
642633
// take ownership of the blob copy and pass it to the batch iterator.
643634
auto *queryBlobCopyPtr = queryBlobCopy.release();
644635
// Ownership of queryBlobCopy moves to VecSimBatchIterator that will free it at the end.
645-
if (indexSize() == 0) {
636+
if (indexLabelCount() == 0) {
646637
return new (this->getAllocator())
647638
NullSVS_BatchIterator(queryBlobCopyPtr, queryParams, this->getAllocator());
648639
} else {
@@ -652,7 +643,7 @@ class SVSIndex : public VecSimIndexAbstract<svs_details::vecsim_dt<DataType>, fl
652643
}
653644

654645
bool preferAdHocSearch(size_t subsetSize, size_t k, bool initial_check) const override {
655-
size_t index_size = this->indexSize();
646+
size_t index_size = this->indexLabelCount();
656647

657648
// Calculate the ratio of the subset size to the total index size.
658649
double subsetRatio = (index_size == 0) ? 0.f : static_cast<double>(subsetSize) / index_size;

tests/flow/test_svs_tiered.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ def test_recall_after_deletion(test_logger):
404404
test_logger.info(f"Done deleting half of the index")
405405
assert index.svs_label_count() >= (num_elements // 2) - indices_ctx.tiered_svs_params.updateTriggerThreshold
406406
assert index.svs_label_count() <= (num_elements // 2) + indices_ctx.tiered_svs_params.updateTriggerThreshold
407-
assert svs_index.index_size() == (num_elements // 2)
407+
assert svs_index.index_size() == num_elements
408408

409409
# Create a list of tuples of the vectors that left.
410410
vectors = [vectors[i] for i in range(1, num_elements, 2)]

tests/unit/test_svs.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -262,20 +262,18 @@ TYPED_TEST(SVSTest, svs_bulk_vectors_add_delete_test) {
262262
runTopKSearchTest(index, query, k, verify_res, nullptr, BY_ID);
263263

264264
// Delete almost all vectors
265-
// First delete small amount of vector to prevent consolidation.
266-
const size_t first_batch_deletion = 10;
267-
ASSERT_EQ(svs_index->deleteVectors(ids.data(), first_batch_deletion), first_batch_deletion);
268-
ASSERT_EQ(VecSimIndex_IndexSize(index), n - first_batch_deletion);
269-
ASSERT_EQ(svs_index->getNumMarkedDeleted(), first_batch_deletion);
270-
271-
// Now delete enough vectors to trigger consolidation.
272265
const size_t keep_num = 1;
273-
ASSERT_EQ(svs_index->deleteVectors(ids.data() + first_batch_deletion,
274-
n - keep_num - first_batch_deletion),
275-
n - keep_num - first_batch_deletion);
276-
ASSERT_EQ(VecSimIndex_IndexSize(index), keep_num);
277-
ASSERT_EQ(svs_index->getNumMarkedDeleted(), 0);
266+
ASSERT_EQ(svs_index->deleteVectors(ids.data(), n - keep_num), n - keep_num);
267+
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
268+
ASSERT_EQ(index->indexLabelCount(), keep_num);
269+
ASSERT_EQ(svs_index->getNumMarkedDeleted(), n - keep_num);
278270

271+
// Delete rest of the vectors
272+
// num_marked_deleted should reset.
273+
ASSERT_EQ(svs_index->deleteVectors(ids.data() + n - keep_num, keep_num), keep_num);
274+
ASSERT_EQ(VecSimIndex_IndexSize(index), 0);
275+
ASSERT_EQ(index->indexLabelCount(), 0);
276+
ASSERT_EQ(svs_index->getNumMarkedDeleted(), 0);
279277
VecSimIndex_Free(index);
280278
}
281279

@@ -453,14 +451,18 @@ TYPED_TEST(SVSTest, svs_reindexing_same_vector) {
453451
for (size_t i = 0; i < n - 1; i++) {
454452
VecSimIndex_DeleteVector(index, i);
455453
}
456-
ASSERT_EQ(VecSimIndex_IndexSize(index), 1);
454+
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
455+
ASSERT_EQ(index->indexLabelCount(), 1);
456+
ASSERT_EQ(svs_index->getNumMarkedDeleted(), n - 1);
457457

458458
// Reinsert the same vectors under the same ids.
459459
for (size_t i = 0; i < n; i++) {
460460
// i / 10 is in integer (take the "floor value).
461461
GenerateAndAddVector<TEST_DATA_T>(index, dim, i, i / 10);
462462
}
463-
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
463+
ASSERT_EQ(VecSimIndex_IndexSize(index), 2 * n);
464+
ASSERT_EQ(index->indexLabelCount(), n);
465+
ASSERT_EQ(svs_index->getNumMarkedDeleted(), n);
464466

465467
// Run the same query again.
466468
runTopKSearchTest(index, query, k, verify_res);
@@ -513,14 +515,18 @@ TYPED_TEST(SVSTest, svs_reindexing_same_vector_different_id) {
513515
for (size_t i = 0; i < n - 1; i++) {
514516
VecSimIndex_DeleteVector(index, i);
515517
}
516-
ASSERT_EQ(VecSimIndex_IndexSize(index), 1);
518+
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
519+
ASSERT_EQ(index->indexLabelCount(), 1);
520+
ASSERT_EQ(svs_index->getNumMarkedDeleted(), n - 1);
517521

518522
// Reinsert the same vectors under different ids than before.
519523
for (size_t i = 0; i < n; i++) {
520524
GenerateAndAddVector<TEST_DATA_T>(index, dim, i + 10,
521525
i / 10); // i / 10 is in integer (take the "floor" value).
522526
}
523-
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
527+
ASSERT_EQ(VecSimIndex_IndexSize(index), 2 * n);
528+
ASSERT_EQ(index->indexLabelCount(), n);
529+
ASSERT_EQ(svs_index->getNumMarkedDeleted(), n);
524530

525531
// Run the same query again.
526532
auto verify_res_different_id = [&](size_t id, double score, size_t index) {
@@ -922,7 +928,8 @@ TYPED_TEST(SVSTest, test_delete_vector) {
922928

923929
// Here the shift should happen.
924930
VecSimIndex_DeleteVector(index, 1);
925-
ASSERT_EQ(VecSimIndex_IndexSize(index), n - 1);
931+
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
932+
ASSERT_EQ(index->indexLabelCount(), n - 1);
926933

927934
TEST_DATA_T query[] = {0.0, 0.0};
928935
auto verify_res = [&](size_t id, double score, size_t index) {
@@ -3026,7 +3033,8 @@ TYPED_TEST(SVSTest, logging_runtime_params) {
30263033
index->addVector(v[i].data(), ids[i]);
30273034
}
30283035
ASSERT_EQ(svs_index->getNumMarkedDeleted(), 10);
3029-
ASSERT_EQ(VecSimIndex_IndexSize(index), n);
3036+
ASSERT_EQ(VecSimIndex_IndexSize(index), n + 10);
3037+
ASSERT_EQ(index->indexLabelCount(), n);
30303038

30313039
float query[] = {50, 50, 50, 50};
30323040
auto verify_res = [&](size_t id, double score, size_t index) { EXPECT_EQ(id, (index + 45)); };

tests/unit/test_svs_multi.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ TYPED_TEST(SVSMultiTest, test_dynamic_svs_info_iterator) {
536536
VecSimIndex_DeleteVector(index, 0);
537537
info = VecSimIndex_DebugInfo(index);
538538
infoIter = VecSimIndex_DebugInfoIterator(index);
539-
ASSERT_EQ(2, info.commonInfo.indexSize);
539+
ASSERT_EQ(4, info.commonInfo.indexSize);
540540
ASSERT_EQ(1, info.commonInfo.indexLabelCount);
541541
compareSVSIndexInfoToIterator(info, infoIter);
542542
VecSimDebugInfoIterator_Free(infoIter);

tests/unit/test_svs_tiered.cpp

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,7 @@ TYPED_TEST(SVSTieredIndexTestBasic, KNNSearch) {
894894
VecSimIndex_DeleteVector(svs_index, i);
895895
}
896896
ASSERT_EQ(flat_index->indexSize(), n * 2 / 3);
897-
ASSERT_EQ(svs_index->indexSize(), n / 2);
897+
ASSERT_EQ(svs_index->indexLabelCount(), n / 2);
898898
k = n * 2 / 3;
899899
cur_memory_usage = allocator->getAllocationSize();
900900
runTopKSearchTest(tiered_index, query_0, k, ver_res_0);
@@ -909,7 +909,7 @@ TYPED_TEST(SVSTieredIndexTestBasic, KNNSearch) {
909909
VecSimIndex_DeleteVector(flat_index, i);
910910
}
911911
ASSERT_EQ(flat_index->indexSize(), n / 6);
912-
ASSERT_EQ(svs_index->indexSize(), n / 2);
912+
ASSERT_EQ(svs_index->indexLabelCount(), n / 2);
913913
k = n / 4;
914914
cur_memory_usage = allocator->getAllocationSize();
915915
runTopKSearchTest(tiered_index, query_0, k, ver_res_0);
@@ -923,7 +923,7 @@ TYPED_TEST(SVSTieredIndexTestBasic, KNNSearch) {
923923
GenerateAndAddVector<TEST_DATA_T>(flat_index, dim, i, i);
924924
}
925925
ASSERT_EQ(flat_index->indexSize(), n * 2 / 3);
926-
ASSERT_EQ(svs_index->indexSize(), 0);
926+
ASSERT_EQ(svs_index->indexLabelCount(), 0);
927927
k = n / 3;
928928
cur_memory_usage = allocator->getAllocationSize();
929929
runTopKSearchTest(tiered_index, query_0, k, ver_res_0);
@@ -1133,27 +1133,33 @@ TYPED_TEST(SVSTieredIndexTestBasic, markedDeleted) {
11331133

11341134
// Override a vector while in the backend
11351135
GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1);
1136-
ASSERT_EQ(tiered_index->indexSize(), n);
1136+
ASSERT_EQ(tiered_index->indexSize(), n + 1);
1137+
ASSERT_EQ(tiered_index->indexLabelCount(), n);
1138+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), n - 1);
11371139
ASSERT_EQ(tiered_index->getNumMarkedDeleted(), 1);
11381140
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), 1);
11391141

1140-
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n - 1);
1142+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
11411143
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 1);
11421144

11431145
// Delete the overriden vector
11441146
VecSimIndex_DeleteVector(tiered_index, 1);
1145-
ASSERT_EQ(tiered_index->indexSize(), n - 1);
1147+
ASSERT_EQ(tiered_index->indexSize(), n);
11461148
ASSERT_EQ(tiered_index->getNumMarkedDeleted(), 1);
11471149
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), 1);
1148-
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n - 1);
1150+
ASSERT_EQ(tiered_index->indexLabelCount(), n - 1);
1151+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), n - 1);
1152+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
11491153
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0);
11501154

1151-
// Delete another arbirtrary vector
1155+
// Delete another arbitrary vector
11521156
VecSimIndex_DeleteVector(tiered_index, 0);
1153-
ASSERT_EQ(tiered_index->indexSize(), n - 2);
1157+
ASSERT_EQ(tiered_index->indexSize(), n);
1158+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
1159+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), n - 2);
1160+
ASSERT_EQ(tiered_index->indexLabelCount(), n - 2);
11541161
ASSERT_EQ(tiered_index->getNumMarkedDeleted(), 2);
11551162
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), 2);
1156-
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n - 2);
11571163
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0);
11581164

11591165
// Empty Index
@@ -1167,6 +1173,8 @@ TYPED_TEST(SVSTieredIndexTestBasic, markedDeleted) {
11671173
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), 0);
11681174
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), 0);
11691175
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0);
1176+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), 0);
1177+
ASSERT_EQ(tiered_index->indexLabelCount(), 0);
11701178
}
11711179

11721180
TYPED_TEST(SVSTieredIndexTestBasic, deleteVectorMulti) {
@@ -2917,18 +2925,26 @@ TYPED_TEST(SVSTieredIndexTest, writeInPlaceMode) {
29172925
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0);
29182926

29192927
// Overwrite inplace - only in single-value mode
2928+
size_t expected_marked_deleted = 0;
29202929
if (!TypeParam::isMulti()) {
29212930
TEST_DATA_T overwritten_vec[] = {1, 1, 1, 1};
29222931
tiered_index->addVector(overwritten_vec, vec_label);
2923-
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), 2);
2932+
expected_marked_deleted++;
2933+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), 3);
2934+
ASSERT_EQ(tiered_index->indexSize(), 3);
2935+
ASSERT_EQ(tiered_index->indexLabelCount(), 2);
29242936
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0);
29252937
ASSERT_EQ(tiered_index->getDistanceFrom_Unsafe(vec_label, overwritten_vec), 0);
2938+
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), expected_marked_deleted);
29262939
}
2927-
// Validate that the vector is removed in place.
2940+
// Validate that the vector is marked as deleted.
29282941
tiered_index->deleteVector(vec_label);
2929-
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), 1);
2930-
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), 0);
2931-
EXPECT_EQ(tiered_index->statisticInfo().numberOfMarkedDeleted, 0);
2942+
expected_marked_deleted++;
2943+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), TypeParam::isMulti() ? 2 : 3);
2944+
ASSERT_EQ(tiered_index->indexLabelCount(), 1);
2945+
2946+
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), expected_marked_deleted);
2947+
EXPECT_EQ(tiered_index->statisticInfo().numberOfMarkedDeleted, expected_marked_deleted);
29322948
}
29332949

29342950
TYPED_TEST(SVSTieredIndexTest, switchWriteModes) {
@@ -3024,7 +3040,7 @@ TYPED_TEST(SVSTieredIndexTest, switchWriteModes) {
30243040
mock_thread_pool.thread_pool_join();
30253041
// Verify that vectors were moved to SVS as expected
30263042
auto sz_f = tiered_index->GetFlatIndex()->indexSize();
3027-
auto sz_b = tiered_index->GetBackendIndex()->indexSize();
3043+
auto sz_b = tiered_index->GetBackendIndex()->indexLabelCount();
30283044
EXPECT_LE(sz_f, this->getUpdateThreshold());
30293045
if (TypeParam::isMulti()) {
30303046
ASSERT_EQ(tiered_index->indexLabelCount(), 2 * n_labels);
@@ -3097,25 +3113,23 @@ TYPED_TEST(SVSTieredIndexTestBasic, runGCAPI) {
30973113
ASSERT_EQ(tiered_index->indexSize(), n);
30983114
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
30993115

3100-
// Delete all the vectors and wait for the thread pool to finish running the update jobs.
31013116
for (size_t i = 0; i < threshold; i++) {
31023117
tiered_index->deleteVector(i);
31033118
}
31043119
ASSERT_EQ(tiered_index->GetSVSIndex()->getNumMarkedDeleted(), threshold);
31053120
EXPECT_EQ(tiered_index->statisticInfo().numberOfMarkedDeleted, threshold);
31063121

3107-
// Launch the BG threads loop that takes jobs from the queue and executes them.
3108-
mock_thread_pool.init_threads();
3109-
mock_thread_pool.thread_pool_join();
3110-
3111-
ASSERT_EQ(tiered_index->indexSize(), n - threshold);
3122+
ASSERT_EQ(tiered_index->indexSize(), n);
3123+
ASSERT_EQ(tiered_index->indexLabelCount(), n - threshold);
3124+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
3125+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), n - threshold);
31123126
ASSERT_EQ(tiered_index->GetSVSIndex()->indexStorageSize(), n);
3113-
ASSERT_EQ(mock_thread_pool.jobQ.size(), 0);
31143127
auto size_before_gc = tiered_index->getAllocationSize();
31153128

31163129
// Run the GC API call, expect that we will clean up the SVS index.
31173130
VecSimTieredIndex_GC(tiered_index);
31183131
ASSERT_EQ(tiered_index->indexSize(), n - threshold);
3132+
ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n - threshold);
31193133
ASSERT_EQ(tiered_index->GetSVSIndex()->indexStorageSize(), n - threshold);
31203134
auto size_after_gc = tiered_index->getAllocationSize();
31213135
// Expect that the size of the index was reduced.
@@ -3177,7 +3191,7 @@ TYPED_TEST(SVSTieredIndexTestBasic, switchDeleteModes) {
31773191
mock_thread_pool.thread_pool_join();
31783192
// Verify that vectors were moved to SVS as expected
31793193
auto sz_f = tiered_index->GetFlatIndex()->indexSize();
3180-
auto sz_b = tiered_index->GetBackendIndex()->indexSize();
3194+
auto sz_b = tiered_index->GetBackendIndex()->indexLabelCount();
31813195
EXPECT_LE(sz_f, update_threshold);
31823196
EXPECT_EQ(sz_f + sz_b, n);
31833197
}
@@ -3270,14 +3284,17 @@ TYPED_TEST(SVSTieredIndexTestBasic, testSwapJournalSingle) {
32703284
// For single-value index, following vectors should be in the index:
32713285
// 0:deleted, 1: 10, 2: deleted, 3:3, ..., n-2:deleted n-1: 10(n-1), n+1: n+1;
32723286
// total: n-2 vectors and labels
3273-
ASSERT_EQ(tiered_index->indexSize(), n - 2);
32743287
ASSERT_EQ(tiered_index->indexLabelCount(), n - 2);
3288+
EXPECT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), n - 5);
32753289

3290+
// We added 3 vectors to the flat index and removed 5 vectors from the backend index.
32763291
// Backend index: 0:deleted, 1:deleted, 2:deleted, 3:3, ..., n-2:deleted, n-1:deleted;
32773292
// total: n-5
3278-
EXPECT_EQ(tiered_index->GetBackendIndex()->indexSize(), n - 5);
3293+
EXPECT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
3294+
ASSERT_EQ(tiered_index->getNumMarkedDeleted(), 5);
32793295
// Frontend index: 1:10, n-1:10(n-1), n+1:n+1
32803296
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 3);
3297+
ASSERT_EQ(tiered_index->indexSize(), n + tiered_index->GetFlatIndex()->indexSize());
32813298

32823299
double abs_err = 1e-2; // Allow a larger relative error for quantization.
32833300
TEST_DATA_T expected_vector[dim];
@@ -3401,13 +3418,16 @@ TYPED_TEST(SVSTieredIndexTestBasic, testSwapJournalMulti) {
34013418
// For multi-value index, following vectors should be in the index:
34023419
// 0: deleted, 1: (1,10), 2: deleted, 3:3, ..., n-2: deleted n-1: 10(n-1), n+1: n+1;
34033420
// total: n-2 labels, n-1 vectors
3404-
ASSERT_EQ(tiered_index->indexSize(), n - 1);
34053421
ASSERT_EQ(tiered_index->indexLabelCount(), n - 2);
3422+
EXPECT_EQ(tiered_index->GetBackendIndex()->indexLabelCount(), n - 4);
34063423

3424+
// We added 3 vectors to the flat index and removed 4 vectors from the backend index.
34073425
// Backend index: 0:deleted, 1:1, 2:deleted, 3:3, ..., n-2:deleted, n-1:deleted; total: n-4
3408-
EXPECT_EQ(tiered_index->GetBackendIndex()->indexSize(), n - 4);
3426+
EXPECT_EQ(tiered_index->GetBackendIndex()->indexSize(), n);
3427+
ASSERT_EQ(tiered_index->getNumMarkedDeleted(), 4);
34093428
// Frontend index: 1:10, n-1:10(n-1), n+1:n+1
34103429
ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 3);
3430+
ASSERT_EQ(tiered_index->indexSize(), n + tiered_index->GetFlatIndex()->indexSize());
34113431

34123432
double abs_err = 1e-2; // Allow a larger relative error for quantization.
34133433
TEST_DATA_T expected_vector[dim];

0 commit comments

Comments
 (0)