summaryrefslogtreecommitdiffstats
path: root/persistence
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2021-01-13 11:01:39 +0100
committerTor Egge <Tor.Egge@broadpark.no>2021-01-15 15:17:53 +0100
commite6f30bdbe67a994339d201ce57b2942e3bd5eb78 (patch)
tree8ca1df13c26267038af447fd4f0ff1328e0a31b0 /persistence
parent1463162fc4b86877df3314c82e76f03a769d2532 (diff)
Add interface for resource usage listener to spi.
Propagate resource usage to service layer.
Diffstat (limited to 'persistence')
-rw-r--r--persistence/src/vespa/persistence/conformancetest/conformancetest.cpp14
-rw-r--r--persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp11
-rw-r--r--persistence/src/vespa/persistence/dummyimpl/dummypersistence.h2
-rw-r--r--persistence/src/vespa/persistence/spi/CMakeLists.txt1
-rw-r--r--persistence/src/vespa/persistence/spi/i_resource_usage_listener.h21
-rw-r--r--persistence/src/vespa/persistence/spi/persistenceprovider.h9
-rw-r--r--persistence/src/vespa/persistence/spi/resource_usage.h33
-rw-r--r--persistence/src/vespa/persistence/spi/resource_usage_listener.cpp32
-rw-r--r--persistence/src/vespa/persistence/spi/resource_usage_listener.h27
9 files changed, 150 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..2d2864bd1fa 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,12 @@ 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.
+ */
+ 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);
+};
+
+}