diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2021-01-20 10:50:38 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2021-01-20 10:50:38 +0100 |
commit | 13691cfa6d95bd663588f04f58e87a36eee68e48 (patch) | |
tree | 4edac6be0d2c1294e67e9cb8c905fd6f8153b50b /storage/src/tests | |
parent | 47cebacad17e3760d0235e360a45a5d2e02a6419 (diff) |
Add ServiceLayerHostInfoReporter.
Diffstat (limited to 'storage/src/tests')
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); |