summaryrefslogtreecommitdiffstats
path: root/storage/src/tests
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2021-01-20 10:50:38 +0100
committerTor Egge <Tor.Egge@broadpark.no>2021-01-20 10:50:38 +0100
commit13691cfa6d95bd663588f04f58e87a36eee68e48 (patch)
tree4edac6be0d2c1294e67e9cb8c905fd6f8153b50b /storage/src/tests
parent47cebacad17e3760d0235e360a45a5d2e02a6419 (diff)
Add ServiceLayerHostInfoReporter.
Diffstat (limited to 'storage/src/tests')
-rw-r--r--storage/src/tests/common/testnodestateupdater.cpp3
-rw-r--r--storage/src/tests/common/testnodestateupdater.h9
-rw-r--r--storage/src/tests/persistence/filestorage/CMakeLists.txt2
-rw-r--r--storage/src/tests/persistence/filestorage/service_layer_host_info_reporter_test.cpp96
-rw-r--r--storage/src/tests/storageserver/statemanagertest.cpp15
5 files changed, 124 insertions, 1 deletions
diff --git a/storage/src/tests/common/testnodestateupdater.cpp b/storage/src/tests/common/testnodestateupdater.cpp
index c4afda1a5ad..27f21a31768 100644
--- a/storage/src/tests/common/testnodestateupdater.cpp
+++ b/storage/src/tests/common/testnodestateupdater.cpp
@@ -10,7 +10,8 @@ TestNodeStateUpdater::TestNodeStateUpdater(const lib::NodeType& type)
_current(new lib::NodeState(type, lib::State::UP)),
_clusterStateBundle(std::make_shared<const lib::ClusterStateBundle>(lib::ClusterState())),
_listeners(),
- _explicit_node_state_reply_send_invocations(0)
+ _explicit_node_state_reply_send_invocations(0),
+ _requested_almost_immediate_node_state_replies(0)
{ }
TestNodeStateUpdater::~TestNodeStateUpdater() = default;
diff --git a/storage/src/tests/common/testnodestateupdater.h b/storage/src/tests/common/testnodestateupdater.h
index e0c636d2715..eb15b97a37f 100644
--- a/storage/src/tests/common/testnodestateupdater.h
+++ b/storage/src/tests/common/testnodestateupdater.h
@@ -19,6 +19,7 @@ struct TestNodeStateUpdater : public NodeStateUpdater
std::shared_ptr<const lib::ClusterStateBundle> _clusterStateBundle;
std::vector<StateListener*> _listeners;
size_t _explicit_node_state_reply_send_invocations;
+ size_t _requested_almost_immediate_node_state_replies;
public:
explicit TestNodeStateUpdater(const lib::NodeType& type);
@@ -37,6 +38,10 @@ public:
++_explicit_node_state_reply_send_invocations;
}
+ void request_almost_immediate_node_state_replies() override {
+ ++_requested_almost_immediate_node_state_replies;
+ }
+
void setCurrentNodeState(const lib::NodeState& state) {
_current = std::make_shared<lib::NodeState>(state);
}
@@ -47,6 +52,10 @@ public:
size_t explicit_node_state_reply_send_invocations() const noexcept {
return _explicit_node_state_reply_send_invocations;
}
+
+ size_t requested_almost_immediate_node_state_replies() const noexcept {
+ return _requested_almost_immediate_node_state_replies;
+ }
};
} // storage
diff --git a/storage/src/tests/persistence/filestorage/CMakeLists.txt b/storage/src/tests/persistence/filestorage/CMakeLists.txt
index 7bd74b83786..33d20e97cb1 100644
--- a/storage/src/tests/persistence/filestorage/CMakeLists.txt
+++ b/storage/src/tests/persistence/filestorage/CMakeLists.txt
@@ -10,11 +10,13 @@ vespa_add_executable(storage_filestorage_gtest_runner_app TEST
modifiedbucketcheckertest.cpp
operationabortingtest.cpp
sanitycheckeddeletetest.cpp
+ service_layer_host_info_reporter_test.cpp
singlebucketjointest.cpp
gtest_runner.cpp
DEPENDS
storage
storageapi
+ storage_testhostreporter
storage_testpersistence_common
GTest::GTest
)
diff --git a/storage/src/tests/persistence/filestorage/service_layer_host_info_reporter_test.cpp b/storage/src/tests/persistence/filestorage/service_layer_host_info_reporter_test.cpp
new file mode 100644
index 00000000000..0c132718d97
--- /dev/null
+++ b/storage/src/tests/persistence/filestorage/service_layer_host_info_reporter_test.cpp
@@ -0,0 +1,96 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/storage/persistence/filestorage/service_layer_host_info_reporter.h>
+#include <tests/common/hostreporter/util.h>
+#include <tests/common/testnodestateupdater.h>
+#include <vespa/vespalib/data/slime/slime.h>
+#include <vespa/vespalib/io/fileutil.h>
+#include <vespa/vespalib/stllike/asciistream.h>
+#include <vespa/vespalib/gtest/gtest.h>
+#include <iostream>
+
+namespace storage {
+
+namespace {
+
+double
+get_usage_element(const vespalib::Slime& root, const vespalib::string& label)
+{
+ return root.get()["content-node"]["resource-usage"][label]["usage"].asDouble();
+}
+
+}
+
+struct ServiceLayerHostInfoReporterTest : ::testing::Test {
+
+ TestNodeStateUpdater _state_manager;
+ ServiceLayerHostInfoReporter _reporter;
+
+ ServiceLayerHostInfoReporterTest();
+ ~ServiceLayerHostInfoReporterTest();
+
+ void notify(double disk_usage, double memory_usage)
+ {
+ auto& listener = static_cast<spi::IResourceUsageListener&>(_reporter);
+ listener.update_resource_usage(spi::ResourceUsage(disk_usage, memory_usage));
+ }
+
+ size_t requested_almost_immediate_replies() { return _state_manager.requested_almost_immediate_node_state_replies(); }
+ std::vector<double> get_old_usage() {
+ auto &old_resource_usage = _reporter.get_old_resource_usage();
+ return std::vector<double>{ old_resource_usage.get_disk_usage(), old_resource_usage.get_memory_usage() };
+ }
+ std::vector<double> get_usage() {
+ auto &resource_usage = _reporter.get_usage();
+ return std::vector<double>{ resource_usage.get_disk_usage(), resource_usage.get_memory_usage() };
+ }
+ std::vector<double> get_slime_usage() {
+ vespalib::Slime root;
+ util::reporterToSlime(_reporter, root);
+ return std::vector<double>{ get_usage_element(root, "disk"), get_usage_element(root, "memory") };
+ }
+};
+
+ServiceLayerHostInfoReporterTest::ServiceLayerHostInfoReporterTest()
+ : _state_manager(lib::NodeType::STORAGE),
+ _reporter(_state_manager)
+{
+}
+
+ServiceLayerHostInfoReporterTest::~ServiceLayerHostInfoReporterTest() = default;
+
+TEST_F(ServiceLayerHostInfoReporterTest, request_almost_immediate_node_state_as_needed)
+{
+ EXPECT_EQ(0, requested_almost_immediate_replies());
+ EXPECT_EQ((std::vector<double>{ 0.0, 0.0 }), get_old_usage());
+ EXPECT_EQ((std::vector<double>{ 0.0, 0.0 }), get_usage());
+ notify(0.5, 0.4);
+ EXPECT_EQ(1, requested_almost_immediate_replies());
+ EXPECT_EQ((std::vector<double>{ 0.5, 0.4 }), get_old_usage());
+ EXPECT_EQ((std::vector<double>{ 0.5, 0.4 }), get_usage());
+ notify(0.501, 0.401);
+ EXPECT_EQ(1, requested_almost_immediate_replies());
+ EXPECT_EQ((std::vector<double>{ 0.5, 0.4 }), get_old_usage());
+ EXPECT_EQ((std::vector<double>{ 0.501, 0.401 }), get_usage());
+ notify(0.8, 0.4);
+ EXPECT_EQ(2, requested_almost_immediate_replies());
+ EXPECT_EQ((std::vector<double>{ 0.8, 0.4 }), get_old_usage());
+ EXPECT_EQ((std::vector<double>{ 0.8, 0.4 }), get_usage());
+ notify(0.8, 0.7);
+ EXPECT_EQ(3, requested_almost_immediate_replies());
+ EXPECT_EQ((std::vector<double>{ 0.8, 0.7 }), get_old_usage());
+ EXPECT_EQ((std::vector<double>{ 0.8, 0.7 }), get_usage());
+ notify(0.799, 0.699);
+ EXPECT_EQ(3, requested_almost_immediate_replies());
+ EXPECT_EQ((std::vector<double>{ 0.8, 0.7 }), get_old_usage());
+ EXPECT_EQ((std::vector<double>{ 0.799, 0.699 }), get_usage());
+}
+
+TEST_F(ServiceLayerHostInfoReporterTest, json_report_generated)
+{
+ EXPECT_EQ((std::vector<double>{ 0.0, 0.0 }), get_slime_usage());
+ notify(0.5, 0.4);
+ EXPECT_EQ((std::vector<double>{ 0.5, 0.4 }), get_slime_usage());
+}
+
+}
diff --git a/storage/src/tests/storageserver/statemanagertest.cpp b/storage/src/tests/storageserver/statemanagertest.cpp
index b55e62d5fd3..1a9882bd0fa 100644
--- a/storage/src/tests/storageserver/statemanagertest.cpp
+++ b/storage/src/tests/storageserver/statemanagertest.cpp
@@ -316,6 +316,21 @@ TEST_F(StateManagerTest, immediate_node_state_replying_is_tracked_per_controller
ASSERT_EQ(0, _upper->getNumReplies());
}
+TEST_F(StateManagerTest, request_almost_immediate_replies_triggers_fast_reply)
+{
+ mark_reported_node_state_up();
+ mark_reply_observed_from_n_controllers(1);
+ auto before = std::chrono::steady_clock::now();
+ for (size_t pass = 0; pass < 100; ++pass) {
+ send_down_get_node_state_request(0);
+ _manager->request_almost_immediate_node_state_replies();
+ _upper->waitForMessage(api::MessageType::GETNODESTATE_REPLY, 2);
+ clear_sent_replies();
+ }
+ auto after = std::chrono::steady_clock::now();
+ ASSERT_GT(10s, after - before);
+}
+
TEST_F(StateManagerTest, activation_command_is_bounced_with_current_cluster_state_version) {
force_current_cluster_state_version(12345);