diff options
author | Geir Storli <geirst@verizonmedia.com> | 2021-08-18 13:17:47 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2021-08-20 11:03:58 +0000 |
commit | 2153b7cc3353992550596141314e5edd3a6c0681 (patch) | |
tree | ef73149677cb4b59d576d935255cba5550b0a281 /searchcore | |
parent | 43402b23dc74fe6550d231b26e8c50327e1971f9 (diff) |
Track max address space usage among components in attributes vectors in all sub databases.
Diffstat (limited to 'searchcore')
7 files changed, 86 insertions, 9 deletions
diff --git a/searchcore/CMakeLists.txt b/searchcore/CMakeLists.txt index dfcc7542e09..2d5eb8dbc4f 100644 --- a/searchcore/CMakeLists.txt +++ b/searchcore/CMakeLists.txt @@ -61,6 +61,7 @@ vespa_define_module( src/tests/proton/attribute/attribute_populator src/tests/proton/attribute/attribute_usage_filter src/tests/proton/attribute/attribute_usage_sampler_functor + src/tests/proton/attribute/attribute_usage_stats src/tests/proton/attribute/attributes_state_explorer src/tests/proton/attribute/document_field_extractor src/tests/proton/attribute/document_field_populator diff --git a/searchcore/src/tests/proton/attribute/attribute_usage_stats/CMakeLists.txt b/searchcore/src/tests/proton/attribute/attribute_usage_stats/CMakeLists.txt new file mode 100644 index 00000000000..b015ca2a168 --- /dev/null +++ b/searchcore/src/tests/proton/attribute/attribute_usage_stats/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchcore_attribute_usage_stats_test_app TEST + SOURCES + attribute_usage_stats_test.cpp + DEPENDS + searchcore_attribute + GTest::GTest +) +vespa_add_test(NAME searchcore_attribute_usage_stats_test_app COMMAND searchcore_attribute_usage_stats_test_app) diff --git a/searchcore/src/tests/proton/attribute/attribute_usage_stats/attribute_usage_stats_test.cpp b/searchcore/src/tests/proton/attribute/attribute_usage_stats/attribute_usage_stats_test.cpp new file mode 100644 index 00000000000..025ae859993 --- /dev/null +++ b/searchcore/src/tests/proton/attribute/attribute_usage_stats/attribute_usage_stats_test.cpp @@ -0,0 +1,47 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/searchcore/proton/attribute/attribute_usage_stats.h> +#include <vespa/vespalib/gtest/gtest.h> + +using proton::AddressSpaceUsageStats; +using proton::AttributeUsageStats; +using search::AddressSpaceUsage; +using vespalib::AddressSpace; + +void +expect_max_usage(size_t used, const vespalib::string& attr_name, + const vespalib::string& comp_name, const vespalib::string& sub_name, + const AttributeUsageStats& stats) +{ + const auto& max = stats.max_usage(); + EXPECT_EQ(used, max.getUsage().used()); + EXPECT_EQ(attr_name, max.getAttributeName()); + EXPECT_EQ(comp_name, max.get_component_name()); + EXPECT_EQ(sub_name, max.getSubDbName()); +} + +TEST(AttributeUsageStatsTest, tracks_max_address_space_usage) +{ + AttributeUsageStats stats; + { + AddressSpaceUsage usage; + usage.set("comp1", AddressSpace(2, 0, 10)); + usage.set("comp2", AddressSpace(3, 0, 10)); + stats.merge(usage, "attr1", "sub1"); + expect_max_usage(3, "attr1", "comp2", "sub1", stats); + } + { + AddressSpaceUsage usage; + usage.set("comp3", AddressSpace(5, 0, 10)); + usage.set("comp4", AddressSpace(4, 0, 10)); + stats.merge(usage, "attr2", "sub2"); + expect_max_usage(5, "attr2", "comp3", "sub2", stats); + } + { + AddressSpaceUsage usage; + usage.set("comp5", AddressSpace(5, 0, 10)); + stats.merge(usage, "attr3", "sub2"); + expect_max_usage(5, "attr2", "comp3", "sub2", stats); + } +} + +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.cpp b/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.cpp index 1acfa64285c..b8cfe86323a 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.cpp @@ -8,6 +8,7 @@ namespace proton { AddressSpaceUsageStats::AddressSpaceUsageStats(const vespalib::AddressSpace & usage) : _usage(usage), _attributeName(), + _component_name(), _subDbName() { } @@ -17,11 +18,13 @@ AddressSpaceUsageStats::~AddressSpaceUsageStats() = default; void AddressSpaceUsageStats::merge(const vespalib::AddressSpace &usage, const vespalib::string &attributeName, + const vespalib::string &component_name, const vespalib::string &subDbName) { if (attributeName.empty() || usage.usage() > _usage.usage()) { _usage = usage; _attributeName = attributeName; + _component_name = component_name; _subDbName = subDbName; } } @@ -31,6 +34,7 @@ operator<<(std::ostream& out, const AddressSpaceUsageStats& rhs) { out << "{usage=" << rhs.getUsage() << ", attribute_name=" << rhs.getAttributeName() << + ", component_name=" << rhs.get_component_name() << ", subdb_name=" << rhs.getSubDbName() << "}"; return out; } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.h b/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.h index 9ed68693ec1..7edc9de5bad 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.h @@ -8,14 +8,14 @@ namespace proton { /** - * Class representing usage of a single address space (enum store or - * multi value) and the most largest attribute in that respect, relative - * to the limit. + * Class representing max address space usage (relative to the limit) + * among components in attributes vectors in all sub databases. */ class AddressSpaceUsageStats { vespalib::AddressSpace _usage; vespalib::string _attributeName; + vespalib::string _component_name; vespalib::string _subDbName; public: @@ -23,15 +23,18 @@ public: ~AddressSpaceUsageStats(); void merge(const vespalib::AddressSpace &usage, const vespalib::string &attributeName, + const vespalib::string &component_name, const vespalib::string &subDbName); const vespalib::AddressSpace &getUsage() const { return _usage; } const vespalib::string &getAttributeName() const { return _attributeName; } + const vespalib::string &get_component_name() const { return _component_name; } const vespalib::string &getSubDbName() const { return _subDbName; } bool operator==(const AddressSpaceUsageStats& rhs) const { return (_usage == rhs._usage) && (_attributeName == rhs._attributeName) && + (_component_name == rhs._component_name) && (_subDbName == rhs._subDbName); } }; diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.cpp b/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.cpp index e7d6713441d..a077c890d18 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.cpp +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.cpp @@ -4,28 +4,37 @@ #include <vespa/searchlib/attribute/address_space_components.h> #include <iostream> +using search::AddressSpaceComponents; + namespace proton { AttributeUsageStats::AttributeUsageStats() - : _enumStoreUsage(search::AddressSpaceComponents::default_enum_store_usage()), - _multiValueUsage(search::AddressSpaceComponents::default_multi_value_usage()) + : _enumStoreUsage(AddressSpaceComponents::default_enum_store_usage()), + _multiValueUsage(AddressSpaceComponents::default_multi_value_usage()), + _max_usage(vespalib::AddressSpace()) { } +AttributeUsageStats::~AttributeUsageStats() = default; + void AttributeUsageStats::merge(const search::AddressSpaceUsage &usage, const vespalib::string &attributeName, const vespalib::string &subDbName) { - _enumStoreUsage.merge(usage.enum_store_usage(), attributeName, subDbName); - _multiValueUsage.merge(usage.multi_value_usage(), attributeName, subDbName); + _enumStoreUsage.merge(usage.enum_store_usage(), attributeName, AddressSpaceComponents::enum_store, subDbName); + _multiValueUsage.merge(usage.multi_value_usage(), attributeName, AddressSpaceComponents::multi_value, subDbName); + for (const auto& entry : usage.get_all()) { + _max_usage.merge(entry.second, attributeName, entry.first, subDbName); + } } std::ostream& operator<<(std::ostream& out, const AttributeUsageStats& rhs) { out << "{enum_store=" << rhs.enumStoreUsage() << - ", multi_value=" << rhs.multiValueUsage() << "}"; + ", multi_value=" << rhs.multiValueUsage() << + ", max_usage=" << rhs.max_usage() << "}"; return out; } diff --git a/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.h b/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.h index 1eb6a9cc6be..53019c856ce 100644 --- a/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.h +++ b/searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.h @@ -16,19 +16,23 @@ class AttributeUsageStats { AddressSpaceUsageStats _enumStoreUsage; AddressSpaceUsageStats _multiValueUsage; + AddressSpaceUsageStats _max_usage; public: AttributeUsageStats(); + ~AttributeUsageStats(); void merge(const search::AddressSpaceUsage &usage, const vespalib::string &attributeName, const vespalib::string &subDbName); const AddressSpaceUsageStats& enumStoreUsage() const { return _enumStoreUsage; } const AddressSpaceUsageStats& multiValueUsage() const { return _multiValueUsage; } + const AddressSpaceUsageStats& max_usage() const { return _max_usage; } bool operator==(const AttributeUsageStats& rhs) const { return (_enumStoreUsage == rhs._enumStoreUsage) && - (_multiValueUsage == rhs._multiValueUsage); + (_multiValueUsage == rhs._multiValueUsage) && + (_max_usage == rhs._max_usage); } }; |