From 03bf070dc2b8f9cab33525575c185525f3e5d2f2 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Wed, 8 Mar 2023 20:00:26 +0000 Subject: Add test showing accounted memory usage for empty attributes. --- .../src/tests/datastore/unique_store/unique_store_test.cpp | 10 +++++++++- vespalib/src/vespa/vespalib/datastore/array_store.h | 2 +- vespalib/src/vespa/vespalib/datastore/array_store.hpp | 11 ++++++++++- vespalib/src/vespa/vespalib/datastore/datastorebase.cpp | 9 +++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) (limited to 'vespalib') diff --git a/vespalib/src/tests/datastore/unique_store/unique_store_test.cpp b/vespalib/src/tests/datastore/unique_store/unique_store_test.cpp index 176792962a6..b9f9becc5a4 100644 --- a/vespalib/src/tests/datastore/unique_store/unique_store_test.cpp +++ b/vespalib/src/tests/datastore/unique_store/unique_store_test.cpp @@ -467,6 +467,14 @@ TEST_F(DoubleTest, nan_is_handled) } std::vector exp_enumerated = { 0, 1, 4, 2, 3, 1, 4, 2 }; EXPECT_EQ(exp_enumerated, enumerated); -} +} + +TEST_F(DoubleTest, control_memory_usage) { + EXPECT_EQ(472u, sizeof(store)); + EXPECT_EQ(32u, store.get_values_memory_usage().allocatedBytes()); + EXPECT_EQ(98208u, store.get_dictionary_memory_usage().allocatedBytes()); + EXPECT_EQ(98240u, store.getMemoryUsage().allocatedBytes()); + EXPECT_EQ(144u, sizeof(BufferState)); +} GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/vespa/vespalib/datastore/array_store.h b/vespalib/src/vespa/vespalib/datastore/array_store.h index 2a193172959..d0ac6a216db 100644 --- a/vespalib/src/vespa/vespalib/datastore/array_store.h +++ b/vespalib/src/vespa/vespalib/datastore/array_store.h @@ -112,7 +112,7 @@ public: // Use this if references to array store is not an array of AtomicEntryRef std::unique_ptr start_compact_worst_buffers(const CompactionStrategy &compaction_strategy); - vespalib::MemoryUsage getMemoryUsage() const { return _store.getMemoryUsage(); } + vespalib::MemoryUsage getMemoryUsage() const; vespalib::MemoryUsage update_stat(const CompactionStrategy& compaction_strategy); bool consider_compact() const noexcept { return _compaction_spec.compact() && !_store.has_held_buffers(); } diff --git a/vespalib/src/vespa/vespalib/datastore/array_store.hpp b/vespalib/src/vespa/vespalib/datastore/array_store.hpp index 53b149fda80..a0fdf3f6563 100644 --- a/vespalib/src/vespa/vespalib/datastore/array_store.hpp +++ b/vespalib/src/vespa/vespalib/datastore/array_store.hpp @@ -56,6 +56,15 @@ ArrayStore::ArrayStore(const ArrayStoreConfig &cfg, s } } +template +vespalib::MemoryUsage +ArrayStore::getMemoryUsage() const { + vespalib::MemoryUsage usage = _store.getMemoryUsage(); + //TODO Must be accounted + // usage.incAllocatedBytes(_smallArrayTypes.capacity() * sizeof(SmallBufferType)); + return usage; +} + template ArrayStore::~ArrayStore() { @@ -181,7 +190,7 @@ vespalib::MemoryUsage ArrayStore::update_stat(const CompactionStrategy& compaction_strategy) { auto address_space_usage = _store.getAddressSpaceUsage(); - auto memory_usage = _store.getMemoryUsage(); + auto memory_usage = getMemoryUsage(); _compaction_spec = compaction_strategy.should_compact(memory_usage, address_space_usage); return memory_usage; } diff --git a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp index a14082e2d5c..6c8b12b8be5 100644 --- a/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp +++ b/vespalib/src/vespa/vespalib/datastore/datastorebase.cpp @@ -264,6 +264,15 @@ vespalib::MemoryUsage DataStoreBase::getMemoryUsage() const { auto stats = getMemStats(); + + size_t extra = 0; + extra += _buffers.capacity() * sizeof(BufferAndTypeId); + extra += _primary_buffer_ids.capacity() * sizeof(uint32_t); + extra += _states.capacity() * sizeof(BufferState); + extra += _typeHandlers.capacity() * sizeof(BufferTypeBase *); + extra += _free_lists.capacity() * sizeof(FreeList); + (void) extra; //TODO Must be accounted as static cost + vespalib::MemoryUsage usage; usage.setAllocatedBytes(stats._allocBytes); usage.setUsedBytes(stats._usedBytes); -- cgit v1.2.3