@@ -824,6 +824,79 @@ TYPED_TEST(SVSTieredIndexTest, deleteVector) {
824824 }
825825}
826826
827+ TYPED_TEST (SVSTieredIndexTestBasic, markedDeleted) {
828+ // Create TieredSVS index instance with a mock queue.
829+ size_t dim = 4 ;
830+ constexpr size_t n = 10 ;
831+ constexpr size_t transfer_trigger = n;
832+ SVSParams params = {.type = TypeParam::get_index_type (),
833+ .dim = dim,
834+ .metric = VecSimMetric_L2,
835+ .num_threads = 1 };
836+ VecSimParams svs_params = CreateParams (params);
837+ auto mock_thread_pool = tieredIndexMock ();
838+
839+ auto *tiered_index = this ->CreateTieredSVSIndex (svs_params, mock_thread_pool, transfer_trigger,
840+ transfer_trigger);
841+ ASSERT_INDEX (tiered_index);
842+
843+ for (size_t i = 0 ; i < n; i++) {
844+ GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, i);
845+ }
846+ // Vectors are still in the flat buffer.
847+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), n);
848+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
849+ // Override a vector while in the flat buffer
850+
851+ GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 0 );
852+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), n);
853+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
854+
855+ // Move vectors to the backend
856+ mock_thread_pool.thread_iteration ();
857+ ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n);
858+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
859+ ASSERT_EQ (tiered_index->indexSize (), n);
860+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
861+
862+ // Override a vector while in the backend
863+ GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1 );
864+ ASSERT_EQ (tiered_index->indexSize (), n);
865+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 1 );
866+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 1 );
867+
868+ ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n - 1 );
869+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 1 );
870+
871+ // Delete the overriden vector
872+ VecSimIndex_DeleteVector (tiered_index, 1 );
873+ ASSERT_EQ (tiered_index->indexSize (), n - 1 );
874+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 1 );
875+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 1 );
876+ ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n - 1 );
877+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
878+
879+ // Delete another arbirtrary vector
880+ VecSimIndex_DeleteVector (tiered_index, 0 );
881+ ASSERT_EQ (tiered_index->indexSize (), n - 2 );
882+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 2 );
883+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 2 );
884+ ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n - 2 );
885+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
886+
887+ // Empty Index
888+ for (size_t i = 2 ; i < n; i++) {
889+ VecSimIndex_DeleteVector (tiered_index, i);
890+ }
891+
892+ // Consolidate should be triggered and mark deleted count should be zeroed.
893+ ASSERT_EQ (tiered_index->indexSize (), 0 );
894+ ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
895+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 0 );
896+ ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), 0 );
897+ ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
898+ }
899+
827900TYPED_TEST (SVSTieredIndexTestBasic, deleteVectorMulti) {
828901 // Create TieredSVS index instance with a mock queue.
829902 size_t dim = 4 ;
@@ -2556,6 +2629,8 @@ TYPED_TEST(SVSTieredIndexTest, writeInPlaceMode) {
25562629 // Validate that the vector is removed in place.
25572630 tiered_index->deleteVector (vec_label);
25582631 ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), 1 );
2632+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 0 );
2633+ EXPECT_EQ (tiered_index->statisticInfo ().numberOfMarkedDeleted , 0 );
25592634}
25602635
25612636TYPED_TEST (SVSTieredIndexTest, switchWriteModes) {
@@ -2728,6 +2803,9 @@ TYPED_TEST(SVSTieredIndexTestBasic, runGCAPI) {
27282803 for (size_t i = 0 ; i < threshold; i++) {
27292804 tiered_index->deleteVector (i);
27302805 }
2806+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), threshold);
2807+ EXPECT_EQ (tiered_index->statisticInfo ().numberOfMarkedDeleted , threshold);
2808+
27312809 // Launch the BG threads loop that takes jobs from the queue and executes them.
27322810 mock_thread_pool.init_threads ();
27332811 mock_thread_pool.thread_pool_join ();
@@ -2744,6 +2822,8 @@ TYPED_TEST(SVSTieredIndexTestBasic, runGCAPI) {
27442822 auto size_after_gc = tiered_index->getAllocationSize ();
27452823 // Expect that the size of the index was reduced.
27462824 ASSERT_LT (size_after_gc, size_before_gc);
2825+ ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 0 );
2826+ EXPECT_EQ (tiered_index->statisticInfo ().numberOfMarkedDeleted , 0 );
27472827}
27482828
27492829TYPED_TEST (SVSTieredIndexTestBasic, switchDeleteModes) {
0 commit comments