From 8376b66142635df44d5737f47ba658d4bd99ca03 Mon Sep 17 00:00:00 2001 From: meiravgri Date: Fri, 24 Oct 2025 07:10:58 +0300 Subject: [PATCH 1/5] skip gc test add test to tiered --- deps/ScalableVectorSearch | 2 +- tests/unit/test_svs_tiered.cpp | 86 ++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/deps/ScalableVectorSearch b/deps/ScalableVectorSearch index 125dea6d0..d88fa26f5 160000 --- a/deps/ScalableVectorSearch +++ b/deps/ScalableVectorSearch @@ -1 +1 @@ -Subproject commit 125dea6d012efd58431aab5f6950e8fbec8f185d +Subproject commit d88fa26f5a70fdff2b862e65caeb407fb0dfc53e diff --git a/tests/unit/test_svs_tiered.cpp b/tests/unit/test_svs_tiered.cpp index d11e3b021..8529e00b6 100644 --- a/tests/unit/test_svs_tiered.cpp +++ b/tests/unit/test_svs_tiered.cpp @@ -5,6 +5,7 @@ #include "unit_test_utils.h" #include "mock_thread_pool.h" +#include "tests_utils.h" #if HAVE_SVS #include @@ -269,6 +270,91 @@ TYPED_TEST(SVSTieredIndexTest, ThreadsReservation) { mock_thread_pool.thread_pool_join(); } +// // Add this function before the test +// std::vector> load_vectors_from_file(const std::string& filename) { +// std::ifstream file(filename); +// std::string line; + +// // Skip first line (metadata) +// std::getline(file, line); + +// // Read second line with vector data +// std::getline(file, line); + +// std::vector> vectors; + +// // Simple parsing: find all [x, y] patterns +// size_t pos = 0; +// while ((pos = line.find('[', pos)) != std::string::npos) { +// size_t end = line.find(']', pos); +// if (end == std::string::npos) break; + +// std::string vector_str = line.substr(pos + 1, end - pos - 1); +// size_t comma = vector_str.find(','); + +// float x = std::stof(vector_str.substr(0, comma)); +// float y = std::stof(vector_str.substr(comma + 1)); + +// vectors.push_back({x, y}); +// pos = end + 1; +// } + +// return vectors; +// } + +TYPED_TEST(SVSTieredIndexTest, svs_bulk_vectors_add_delete_test2) { + // Create TieredSVS index instance with a mock queue. + size_t dim = 2; + SVSParams params = {.type = TypeParam::get_index_type(), + .dim = dim, + .metric = VecSimMetric_L2, + .multi = TypeParam::isMulti(), + .construction_window_size = 10, + .num_threads = 1}; + VecSimParams svs_params = CreateParams(params); + + auto mock_thread_pool = tieredIndexMock(); + + auto tiered_params = this->CreateTieredSVSParams(svs_params, mock_thread_pool, 0, 0); + auto *tiered_index = this->CreateTieredSVSIndex(tiered_params, mock_thread_pool); + ASSERT_INDEX(tiered_index); + VecSim_SetWriteMode(VecSim_WriteInPlace); + + size_t n = 1024 * 10; + // Load vectors once before the loop + // static auto file_vectors = load_vectors_from_file("/tmp/Test_logs_with_vecs/tests/pytests/vectors_FLOAT32_no_compression.txt"); + + ASSERT_EQ(file_vectors.size(), n); + for (size_t i = 0; i < n; i++) { + TEST_DATA_T vector[dim]; + // if (i < file_vectors.size()) { + // vector[0] = file_vectors[i][0]; + // vector[1] = file_vectors[i][1]; + // } + test_utils::populate_float_vec(vector, dim, i); + VecSimIndex_AddVector(tiered_index, vector, i); + } + + ASSERT_EQ(tiered_index->indexSize(), n); + ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0); + ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), n); + size_t keep_count = 10; + for (size_t i = 0; i < n - keep_count; i++) { + VecSimIndex_DeleteVector(tiered_index, i); + } + // Validate that the vector was inserted to the flat buffer properly. + ASSERT_EQ(tiered_index->indexSize(), keep_count); + ASSERT_EQ(tiered_index->GetFlatIndex()->indexSize(), 0); + ASSERT_EQ(tiered_index->GetBackendIndex()->indexSize(), keep_count); + TEST_DATA_T query[dim]; + test_utils::populate_float_vec(query, dim); + size_t k = 10; + VecSimQueryReply *res = VecSimIndex_TopKQuery(tiered_index, query, k, nullptr, BY_SCORE); +VecSimQueryReply_Free(res); + +} + + TYPED_TEST(SVSTieredIndexTest, TestDebugInfoThreadCount) { // Set thread_pool_size to 4 or actual number of available CPUs const auto num_threads = std::min(4U, getAvailableCPUs()); From 29045b9dd331a2b9a7deda01e5538f91b98b0162 Mon Sep 17 00:00:00 2001 From: meiravgri Date: Fri, 24 Oct 2025 07:15:47 +0300 Subject: [PATCH 2/5] format --- tests/unit/test_svs_tiered.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_svs_tiered.cpp b/tests/unit/test_svs_tiered.cpp index 8529e00b6..2e6885202 100644 --- a/tests/unit/test_svs_tiered.cpp +++ b/tests/unit/test_svs_tiered.cpp @@ -322,7 +322,8 @@ TYPED_TEST(SVSTieredIndexTest, svs_bulk_vectors_add_delete_test2) { size_t n = 1024 * 10; // Load vectors once before the loop - // static auto file_vectors = load_vectors_from_file("/tmp/Test_logs_with_vecs/tests/pytests/vectors_FLOAT32_no_compression.txt"); + // static auto file_vectors = + // load_vectors_from_file("/tmp/Test_logs_with_vecs/tests/pytests/vectors_FLOAT32_no_compression.txt"); ASSERT_EQ(file_vectors.size(), n); for (size_t i = 0; i < n; i++) { @@ -350,11 +351,9 @@ TYPED_TEST(SVSTieredIndexTest, svs_bulk_vectors_add_delete_test2) { test_utils::populate_float_vec(query, dim); size_t k = 10; VecSimQueryReply *res = VecSimIndex_TopKQuery(tiered_index, query, k, nullptr, BY_SCORE); -VecSimQueryReply_Free(res); - + VecSimQueryReply_Free(res); } - TYPED_TEST(SVSTieredIndexTest, TestDebugInfoThreadCount) { // Set thread_pool_size to 4 or actual number of available CPUs const auto num_threads = std::min(4U, getAvailableCPUs()); From 764a888a3b3f0fd7567c17aa7b185c93d428d923 Mon Sep 17 00:00:00 2001 From: meiravgri Date: Fri, 24 Oct 2025 07:26:34 +0300 Subject: [PATCH 3/5] fix tets --- tests/unit/test_svs_tiered.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_svs_tiered.cpp b/tests/unit/test_svs_tiered.cpp index 2e6885202..ad8eb5065 100644 --- a/tests/unit/test_svs_tiered.cpp +++ b/tests/unit/test_svs_tiered.cpp @@ -325,7 +325,7 @@ TYPED_TEST(SVSTieredIndexTest, svs_bulk_vectors_add_delete_test2) { // static auto file_vectors = // load_vectors_from_file("/tmp/Test_logs_with_vecs/tests/pytests/vectors_FLOAT32_no_compression.txt"); - ASSERT_EQ(file_vectors.size(), n); + // ASSERT_EQ(file_vectors.size(), n); for (size_t i = 0; i < n; i++) { TEST_DATA_T vector[dim]; // if (i < file_vectors.size()) { From b682f7773d88fa5f094817a914c9e0ce12f28d6a Mon Sep 17 00:00:00 2001 From: meiravgri Date: Fri, 24 Oct 2025 07:48:16 +0300 Subject: [PATCH 4/5] use open source --- ...0_INT8_multi_100labels_.hnsw_current_version | Bin 0 -> 62366 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/unit/1k-d4-L2-M8-ef_c10_INT8_multi_100labels_.hnsw_current_version diff --git a/tests/unit/1k-d4-L2-M8-ef_c10_INT8_multi_100labels_.hnsw_current_version b/tests/unit/1k-d4-L2-M8-ef_c10_INT8_multi_100labels_.hnsw_current_version new file mode 100644 index 0000000000000000000000000000000000000000..784823fbbaa95c5c58e2f15d29c363dd17293388 GIT binary patch literal 62366 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 z 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 IElI)u1F5c$g8%>k literal 0 HcmV?d00001 From b584636baf8c95ac996f5a8c3018c7ca03549308 Mon Sep 17 00:00:00 2001 From: meiravgri Date: Wed, 29 Oct 2025 07:44:35 +0200 Subject: [PATCH 5/5] apply Ishwar fix on top of v0.0.10 --- deps/ScalableVectorSearch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/ScalableVectorSearch b/deps/ScalableVectorSearch index d88fa26f5..6cb579ca5 160000 --- a/deps/ScalableVectorSearch +++ b/deps/ScalableVectorSearch @@ -1 +1 @@ -Subproject commit d88fa26f5a70fdff2b862e65caeb407fb0dfc53e +Subproject commit 6cb579ca54d5a3c2a3673577f9c4b6371f448a76