diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-01-15 18:37:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-15 18:37:09 +0100 |
commit | dfeaed2d8926952e1898f5d75df2a4e83a2a5ff2 (patch) | |
tree | 87842e82d554ec1cccbd465291341d1f1df9e015 /persistence/src | |
parent | e096763f29f772fe80ac616cb70e6fe6a95c80fe (diff) | |
parent | ccee17a0dd81e50894d24ea6fc702808eef761c5 (diff) |
Merge pull request #16067 from vespa-engine/toregge/add-resource-usage-listener-to-spi-try2
Add interface for resource usage listener to spi.
Diffstat (limited to 'persistence/src')
9 files changed, 151 insertions, 0 deletions
diff --git a/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp b/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp index 7da88e34ee9..2fbe6c8b5a6 100644 --- a/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp +++ b/persistence/src/vespa/persistence/conformancetest/conformancetest.cpp @@ -3,6 +3,7 @@ #include <vespa/document/base/testdocman.h> #include <vespa/persistence/conformancetest/conformancetest.h> #include <vespa/persistence/spi/test.h> +#include <vespa/persistence/spi/resource_usage_listener.h> #include <vespa/document/fieldset/fieldsets.h> #include <vespa/document/update/documentupdate.h> #include <vespa/document/update/assignvalueupdate.h> @@ -14,6 +15,7 @@ #include <vespa/vdslib/state/nodestate.h> #include <vespa/vdslib/state/clusterstate.h> #include <vespa/vdslib/distribution/distribution.h> +#include <vespa/vespalib/util/idestructorcallback.h> #include <vespa/config-stor-distribution.h> #include <algorithm> #include <limits> @@ -2255,6 +2257,18 @@ TEST_F(ConformanceTest, testBucketSpaces) assertBucketInfo(*spi, bucket12, 1); } +TEST_F(ConformanceTest, resource_usage) +{ + ResourceUsageListener resource_usage_listener; + document::TestDocMan testDocMan; + PersistenceProviderUP spi(getSpi(*_factory, testDocMan)); + EXPECT_EQ(0.0, resource_usage_listener.get_usage().get_disk_usage()); + EXPECT_EQ(0.0, resource_usage_listener.get_usage().get_memory_usage()); + auto register_guard = spi->register_resource_usage_listener(resource_usage_listener); + EXPECT_EQ(0.5, resource_usage_listener.get_usage().get_disk_usage()); + EXPECT_EQ(0.4, resource_usage_listener.get_usage().get_memory_usage()); +} + TEST_F(ConformanceTest, detectAndTestOptionalBehavior) { // Report if implementation supports setting bucket size info. diff --git a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp index bc7310f4806..0c1c5db69d6 100644 --- a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp +++ b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp @@ -6,10 +6,13 @@ #include <vespa/document/fieldvalue/document.h> #include <vespa/document/update/documentupdate.h> #include <vespa/document/bucket/fixed_bucket_spaces.h> +#include <vespa/persistence/spi/i_resource_usage_listener.h> +#include <vespa/persistence/spi/resource_usage.h> #include <vespa/vespalib/util/crc.h> #include <vespa/document/fieldset/fieldsetrepo.h> #include <vespa/vespalib/stllike/asciistream.h> #include <vespa/vespalib/util/exceptions.h> +#include <vespa/vespalib/util/idestructorcallback.h> #include <vespa/vespalib/stllike/hash_map.hpp> #include <algorithm> #include <cassert> @@ -852,6 +855,14 @@ DummyPersistence::join(const Bucket& source1, const Bucket& source2, return Result(); } +std::unique_ptr<vespalib::IDestructorCallback> +DummyPersistence::register_resource_usage_listener(IResourceUsageListener &listener) +{ + ResourceUsage usage(0.5, 0.4); + listener.update_resource_usage(usage); + return {}; +} + std::string DummyPersistence::dumpBucket(const Bucket& b) const { diff --git a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.h b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.h index 6b80d6bab0f..c37af0d33eb 100644 --- a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.h +++ b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.h @@ -175,6 +175,8 @@ public: Result join(const Bucket& source1, const Bucket& source2, const Bucket& target, Context&) override; + std::unique_ptr<vespalib::IDestructorCallback> register_resource_usage_listener(IResourceUsageListener& listener) override; + /** * The following methods are used only for unit testing. * DummyPersistence is used many places to test the framework around it. diff --git a/persistence/src/vespa/persistence/spi/CMakeLists.txt b/persistence/src/vespa/persistence/spi/CMakeLists.txt index efc744e0792..aad99e12a69 100644 --- a/persistence/src/vespa/persistence/spi/CMakeLists.txt +++ b/persistence/src/vespa/persistence/spi/CMakeLists.txt @@ -10,6 +10,7 @@ vespa_add_library(persistence_spi OBJECT exceptions.cpp persistenceprovider.cpp read_consistency.cpp + resource_usage_listener.cpp result.cpp selection.cpp test.cpp diff --git a/persistence/src/vespa/persistence/spi/i_resource_usage_listener.h b/persistence/src/vespa/persistence/spi/i_resource_usage_listener.h new file mode 100644 index 00000000000..72f6f8fbc59 --- /dev/null +++ b/persistence/src/vespa/persistence/spi/i_resource_usage_listener.h @@ -0,0 +1,21 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/vespalib/stllike/string.h> + +namespace storage::spi { + +class ResourceUsage; + +/* + * Interface class for listening to resource usage updates. + */ +class IResourceUsageListener +{ +public: + virtual ~IResourceUsageListener() = default; + virtual void update_resource_usage(const ResourceUsage& resource_usage) = 0; +}; + +} diff --git a/persistence/src/vespa/persistence/spi/persistenceprovider.h b/persistence/src/vespa/persistence/spi/persistenceprovider.h index d00862ed5fa..2fc0713abe8 100644 --- a/persistence/src/vespa/persistence/spi/persistenceprovider.h +++ b/persistence/src/vespa/persistence/spi/persistenceprovider.h @@ -12,9 +12,12 @@ #include "operationcomplete.h" namespace document { class FieldSet; } +namespace vespalib { class IDestructorCallback; } namespace storage::spi { +class IResourceUsageListener; + /** * This interface is the basis for a persistence provider in Vespa. A * persistence provider is used by Vespa Storage to provide an elastic stateful @@ -374,6 +377,13 @@ struct PersistenceProvider * source1 and source2 should be stored in the target bucket. */ virtual Result join(const Bucket& source1, const Bucket& source2, const Bucket& target, Context&) = 0; + + /* + * Register a listener for updates to resource usage. + * The listener is deregistered when the returned object is destroyed. + */ + virtual std::unique_ptr<vespalib::IDestructorCallback> register_resource_usage_listener(IResourceUsageListener& listener) = 0; + }; } diff --git a/persistence/src/vespa/persistence/spi/resource_usage.h b/persistence/src/vespa/persistence/spi/resource_usage.h new file mode 100644 index 00000000000..1b2504b0f13 --- /dev/null +++ b/persistence/src/vespa/persistence/spi/resource_usage.h @@ -0,0 +1,33 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +namespace storage::spi { + +/* + * Class representing resource usage for persistence provider. + * Numbers are normalized to be between 0.0 and 1.0 + */ +class ResourceUsage +{ + double _disk_usage; + double _memory_usage; +public: + + ResourceUsage(double disk_usage, double memory_usage) + : _disk_usage(disk_usage), + _memory_usage(memory_usage) + { + } + + ResourceUsage() + : ResourceUsage(0.0, 0.0) + { + } + + double get_disk_usage() const noexcept { return _disk_usage; } + double get_memory_usage() const noexcept { return _memory_usage; } +}; + +} + diff --git a/persistence/src/vespa/persistence/spi/resource_usage_listener.cpp b/persistence/src/vespa/persistence/spi/resource_usage_listener.cpp new file mode 100644 index 00000000000..123aac2a62b --- /dev/null +++ b/persistence/src/vespa/persistence/spi/resource_usage_listener.cpp @@ -0,0 +1,32 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "resource_usage_listener.h" +#include <vespa/vespalib/util/idestructorcallback.h> + +namespace storage::spi { + +ResourceUsageListener::ResourceUsageListener() + : IResourceUsageListener(), + _usage(), + _register_guard() +{ +} + +ResourceUsageListener::~ResourceUsageListener() +{ + _register_guard.reset(); +} + +void +ResourceUsageListener::update_resource_usage(const ResourceUsage& resource_usage) +{ + _usage = resource_usage; +} + +void +ResourceUsageListener::set_register_guard(std::unique_ptr<vespalib::IDestructorCallback> register_guard) +{ + _register_guard = std::move(register_guard); +} + +} diff --git a/persistence/src/vespa/persistence/spi/resource_usage_listener.h b/persistence/src/vespa/persistence/spi/resource_usage_listener.h new file mode 100644 index 00000000000..ff16c4a011a --- /dev/null +++ b/persistence/src/vespa/persistence/spi/resource_usage_listener.h @@ -0,0 +1,27 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "i_resource_usage_listener.h" +#include "resource_usage.h" + +namespace vespalib { class IDestructorCallback; } + +namespace storage::spi { + +/* + * Class for listening to resource usage updates. + */ +class ResourceUsageListener : public IResourceUsageListener +{ + ResourceUsage _usage; + std::unique_ptr<vespalib::IDestructorCallback> _register_guard; +public: + ResourceUsageListener(); + ~ResourceUsageListener() override; + void update_resource_usage(const ResourceUsage& resource_usage) override; + const ResourceUsage& get_usage() const noexcept { return _usage; } + void set_register_guard(std::unique_ptr<vespalib::IDestructorCallback> register_guard); +}; + +} |