diff options
Diffstat (limited to 'searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp')
-rw-r--r-- | searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp b/searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp index 3dba1aa44ac..bc1417e325a 100644 --- a/searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp +++ b/searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp @@ -2,14 +2,17 @@ #include <vespa/searchlib/tensor/hnsw_nodeid_mapping.h> #include <vespa/searchlib/tensor/hnsw_node.h> +#include <vespa/vespalib/datastore/compaction_strategy.h> #include <vespa/vespalib/gtest/gtest.h> using namespace search::tensor; +using vespalib::datastore::CompactionStrategy; using vespalib::datastore::EntryRef; class HnswNodeidMappingTest : public ::testing::Test { public: using NodeidVector = std::vector<uint32_t>; + using NodeidVectorVector = std::vector<NodeidVector>; HnswNodeidMapping mapping; HnswNodeidMappingTest() @@ -27,6 +30,27 @@ public: auto ids = mapping.get_ids(docid); EXPECT_EQ(exp_ids, NodeidVector(ids.begin(), ids.end())); } + NodeidVector get_id_vector(uint32_t docid) { + auto ids = mapping.get_ids(docid); + return { ids.begin(), ids.end() }; + } + NodeidVectorVector get_id_vectors(uint32_t docid_limit) { + NodeidVectorVector id_vectors; + id_vectors.reserve(docid_limit); + for (uint32_t docid = 0; docid < docid_limit; ++docid) { + id_vectors.push_back(get_id_vector(docid)); + } + return id_vectors; + } + void expect_id_vectors(const NodeidVectorVector& exp) { + for (uint32_t docid = 0; docid < exp.size(); ++docid) { + EXPECT_EQ(exp[docid], get_id_vector(docid)); + } + } + void drop_held_memory() { + mapping.assign_generation(1); + mapping.reclaim_memory(2); + } }; @@ -107,5 +131,38 @@ TEST_F(HnswNodeidMappingTest, memory_usage_increases_when_allocating_nodeids) EXPECT_GT(b.usedBytes(), a.usedBytes()); } +TEST_F(HnswNodeidMappingTest, compaction_works) +{ + const uint32_t docid_limit = 20000; + const uint32_t min_multinode_docid = 4; + for (uint32_t docid = 1; docid < docid_limit; ++docid) { + mapping.allocate_ids(docid, 1); + } + CompactionStrategy compaction_strategy; + (void) mapping.update_stat(compaction_strategy); + EXPECT_FALSE(mapping.consider_compact()); + for (uint32_t docid = min_multinode_docid; docid < docid_limit; ++docid) { + mapping.free_ids(docid); + drop_held_memory(); + mapping.allocate_ids(docid, 2); + } + auto id_vectors = get_id_vectors(docid_limit); + auto mem_before = mapping.update_stat(compaction_strategy); + EXPECT_EQ(0, mem_before.allocatedBytesOnHold()); + EXPECT_LT(0, mem_before.usedBytes()); + EXPECT_TRUE(mapping.consider_compact()); + mapping.compact_worst(compaction_strategy); + EXPECT_FALSE(mapping.consider_compact()); + auto mem_after = mapping.update_stat(compaction_strategy); + drop_held_memory(); + auto mem_after_drop = mapping.update_stat(compaction_strategy); + EXPECT_LT(0, mem_after.allocatedBytesOnHold()); + EXPECT_LT(mem_before.usedBytes(), mem_after.usedBytes()); + EXPECT_GT(mem_before.deadBytes(), mem_after.deadBytes()); + EXPECT_EQ(0, mem_after_drop.allocatedBytesOnHold()); + EXPECT_GT(mem_before.usedBytes(), mem_after_drop.usedBytes()); + expect_id_vectors(id_vectors); +} + GTEST_MAIN_RUN_ALL_TESTS() |