summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2021-08-18 13:17:47 +0000
committerGeir Storli <geirst@verizonmedia.com>2021-08-20 11:03:58 +0000
commit2153b7cc3353992550596141314e5edd3a6c0681 (patch)
treeef73149677cb4b59d576d935255cba5550b0a281 /searchcore
parent43402b23dc74fe6550d231b26e8c50327e1971f9 (diff)
Track max address space usage among components in attributes vectors in all sub databases.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/CMakeLists.txt1
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_usage_stats/CMakeLists.txt9
-rw-r--r--searchcore/src/tests/proton/attribute/attribute_usage_stats/attribute_usage_stats_test.cpp47
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.cpp4
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/address_space_usage_stats.h9
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.cpp19
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/attribute_usage_stats.h6
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);
}
};