summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/tensor/hnsw_nodeid_mapping/hnsw_nodeid_mapping_test.cpp
diff options
context:
space:
mode:
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.cpp57
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()