@@ -738,6 +738,79 @@ TYPED_TEST(SVSTieredIndexTest, deleteVector) {
738738    }
739739}
740740
741+ TYPED_TEST (SVSTieredIndexTestBasic, markedDeleted) {
742+     //  Create TieredSVS index instance with a mock queue.
743+     size_t  dim = 4 ;
744+     constexpr  size_t  n = 10 ;
745+     constexpr  size_t  transfer_trigger = n;
746+     SVSParams params = {.type  = TypeParam::get_index_type (),
747+                         .dim  = dim,
748+                         .metric  = VecSimMetric_L2,
749+                         .num_threads  = 1 };
750+     VecSimParams svs_params = CreateParams (params);
751+     auto  mock_thread_pool = tieredIndexMock ();
752+ 
753+     auto  *tiered_index = this ->CreateTieredSVSIndex (svs_params, mock_thread_pool, transfer_trigger,
754+                                                     transfer_trigger);
755+     ASSERT_INDEX (tiered_index);
756+ 
757+     for  (size_t  i = 0 ; i < n; i++) {
758+         GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, i);
759+     }
760+     //  Vectors are still in the flat buffer.
761+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), n);
762+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
763+     //  Override a vector while in the flat buffer
764+ 
765+     GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 0 );
766+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), n);
767+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
768+ 
769+     //  Move vectors to the backend
770+     mock_thread_pool.thread_iteration ();
771+     ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n);
772+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
773+     ASSERT_EQ (tiered_index->indexSize (), n);
774+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
775+ 
776+     //  Override a vector while in the backend
777+     GenerateAndAddVector<TEST_DATA_T>(tiered_index, dim, 1 );
778+     ASSERT_EQ (tiered_index->indexSize (), n);
779+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 1 );
780+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 1 );
781+ 
782+     ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n - 1 );
783+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 1 );
784+ 
785+     //  Delete the overriden vector
786+     VecSimIndex_DeleteVector (tiered_index, 1 );
787+     ASSERT_EQ (tiered_index->indexSize (), n - 1 );
788+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 1 );
789+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 1 );
790+     ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n - 1 );
791+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
792+ 
793+     //  Delete another arbirtrary vector
794+     VecSimIndex_DeleteVector (tiered_index, 0 );
795+     ASSERT_EQ (tiered_index->indexSize (), n - 2 );
796+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 2 );
797+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 2 );
798+     ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), n - 2 );
799+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
800+ 
801+     //  Empty Index
802+     for  (size_t  i = 2 ; i < n; i++) {
803+         VecSimIndex_DeleteVector (tiered_index, i);
804+     }
805+ 
806+     //  Consolidate should be triggered and mark deleted count should be zeroed.
807+     ASSERT_EQ (tiered_index->indexSize (), 0 );
808+     ASSERT_EQ (tiered_index->getNumMarkedDeleted (), 0 );
809+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 0 );
810+     ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), 0 );
811+     ASSERT_EQ (tiered_index->GetFlatIndex ()->indexSize (), 0 );
812+ }
813+ 
741814TYPED_TEST (SVSTieredIndexTest, manageIndexOwnership) {
742815
743816    //  Create TieredSVS index instance with a mock queue.
@@ -2211,6 +2284,8 @@ TYPED_TEST(SVSTieredIndexTest, writeInPlaceMode) {
22112284    //  Validate that the vector is removed in place.
22122285    tiered_index->deleteVector (vec_label);
22132286    ASSERT_EQ (tiered_index->GetBackendIndex ()->indexSize (), 1 );
2287+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 0 );
2288+     EXPECT_EQ (tiered_index->statisticInfo ().numberOfMarkedDeleted , 0 );
22142289}
22152290
22162291TYPED_TEST (SVSTieredIndexTest, switchWriteModes) {
@@ -2375,6 +2450,9 @@ TYPED_TEST(SVSTieredIndexTestBasic, runGCAPI) {
23752450    for  (size_t  i = 0 ; i < threshold; i++) {
23762451        tiered_index->deleteVector (i);
23772452    }
2453+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), threshold);
2454+     EXPECT_EQ (tiered_index->statisticInfo ().numberOfMarkedDeleted , threshold);
2455+ 
23782456    //  Launch the BG threads loop that takes jobs from the queue and executes them.
23792457    mock_thread_pool.init_threads ();
23802458    mock_thread_pool.thread_pool_join ();
@@ -2391,6 +2469,8 @@ TYPED_TEST(SVSTieredIndexTestBasic, runGCAPI) {
23912469    auto  size_after_gc = tiered_index->getAllocationSize ();
23922470    //  Expect that the size of the index was reduced.
23932471    ASSERT_LT (size_after_gc, size_before_gc);
2472+     ASSERT_EQ (tiered_index->GetSVSIndex ()->getNumMarkedDeleted (), 0 );
2473+     EXPECT_EQ (tiered_index->statisticInfo ().numberOfMarkedDeleted , 0 );
23942474}
23952475
23962476TYPED_TEST (SVSTieredIndexTestBasic, switchDeleteModes) {
0 commit comments