aboutsummaryrefslogtreecommitdiffstats
path: root/storage/src/tests/storageserver/statemanagertest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/src/tests/storageserver/statemanagertest.cpp')
-rw-r--r--storage/src/tests/storageserver/statemanagertest.cpp88
1 files changed, 77 insertions, 11 deletions
diff --git a/storage/src/tests/storageserver/statemanagertest.cpp b/storage/src/tests/storageserver/statemanagertest.cpp
index 5c201f86f90..45939cf3e63 100644
--- a/storage/src/tests/storageserver/statemanagertest.cpp
+++ b/storage/src/tests/storageserver/statemanagertest.cpp
@@ -35,13 +35,23 @@ struct StateManagerTest : public CppUnit::TestFixture {
void testReportedNodeState();
void current_cluster_state_version_is_included_in_host_info_json();
void can_explicitly_send_get_node_state_reply();
+ void explicit_node_state_send_without_pending_request_immediately_replies_on_next_request();
+ void immediate_node_state_reply_sending_is_tracked_per_controller();
CPPUNIT_TEST_SUITE(StateManagerTest);
CPPUNIT_TEST(testSystemState);
CPPUNIT_TEST(testReportedNodeState);
CPPUNIT_TEST(current_cluster_state_version_is_included_in_host_info_json);
CPPUNIT_TEST(can_explicitly_send_get_node_state_reply);
+ CPPUNIT_TEST(explicit_node_state_send_without_pending_request_immediately_replies_on_next_request);
+ CPPUNIT_TEST(immediate_node_state_reply_sending_is_tracked_per_controller);
CPPUNIT_TEST_SUITE_END();
+
+ void mark_reported_node_state_up();
+ void send_down_get_node_state_request(uint16_t controller_index);
+ void assert_ok_get_node_state_reply_sent_and_clear();
+ void clear_sent_replies();
+ void mark_reply_observed_from_n_controllers(uint16_t n);
};
CPPUNIT_TEST_SUITE_REGISTRATION(StateManagerTest);
@@ -255,26 +265,82 @@ void StateManagerTest::current_cluster_state_version_is_included_in_host_info_js
CPPUNIT_ASSERT_EQUAL(123, version);
}
-void StateManagerTest::can_explicitly_send_get_node_state_reply() {
- {
- auto lock = _manager->grabStateChangeLock();
- _manager->setReportedNodeState(NodeState(NodeType::STORAGE, State::UP));
- }
- // Send down a GetNodeState with the same state as we currently have. This
- // ensures that the StateManager doesn't auto-reply with the current state
- // to inform the caller that the state has changed.
+void StateManagerTest::mark_reported_node_state_up() {
+ auto lock = _manager->grabStateChangeLock();
+ _manager->setReportedNodeState(NodeState(NodeType::STORAGE, State::UP));
+}
+
+void StateManagerTest::send_down_get_node_state_request(uint16_t controller_index) {
auto cmd = std::make_shared<api::GetNodeStateCommand>(
std::make_unique<NodeState>(NodeType::STORAGE, State::UP));
cmd->setTimeout(10000000);
+ cmd->setSourceIndex(controller_index);
_upper->sendDown(cmd);
+}
+void StateManagerTest::assert_ok_get_node_state_reply_sent_and_clear() {
+ CPPUNIT_ASSERT_EQUAL(size_t(1), _upper->getNumReplies());
+ std::shared_ptr<api::StorageReply> reply;
+ GET_ONLY_OK_REPLY(reply); // Implicitly clears messages from _upper
+ CPPUNIT_ASSERT_EQUAL(api::MessageType::GETNODESTATE_REPLY, reply->getType());
+}
+
+void StateManagerTest::clear_sent_replies() {
+ _upper->getRepliesOnce();
+}
+
+void StateManagerTest::mark_reply_observed_from_n_controllers(uint16_t n) {
+ for (uint16_t i = 0; i < n; ++i) {
+ send_down_get_node_state_request(i);
+ assert_ok_get_node_state_reply_sent_and_clear();
+ }
+}
+
+void StateManagerTest::can_explicitly_send_get_node_state_reply() {
+ mark_reported_node_state_up();
+ // Must "pre-trigger" that a controller has already received a GetNodeState
+ // reply, or an immediate reply will be sent by default when the first request
+ // from a controller is observed.
+ mark_reply_observed_from_n_controllers(1);
+
+ send_down_get_node_state_request(0);
CPPUNIT_ASSERT_EQUAL(size_t(0), _upper->getNumReplies());
_manager->immediately_send_get_node_state_replies();
+ assert_ok_get_node_state_reply_sent_and_clear();
+}
- std::shared_ptr<api::StorageReply> reply;
- GET_ONLY_OK_REPLY(reply);
- CPPUNIT_ASSERT_EQUAL(api::MessageType::GETNODESTATE_REPLY, reply->getType());
+void StateManagerTest::explicit_node_state_send_without_pending_request_immediately_replies_on_next_request() {
+ mark_reported_node_state_up();
+ mark_reply_observed_from_n_controllers(1);
+
+ // No pending requests at this time
+ _manager->immediately_send_get_node_state_replies();
+
+ send_down_get_node_state_request(0);
+ assert_ok_get_node_state_reply_sent_and_clear();
+ // Sending a new request should now _not_ immediately receive a reply
+ send_down_get_node_state_request(0);
+ CPPUNIT_ASSERT_EQUAL(size_t(0), _upper->getNumReplies());
+}
+
+void StateManagerTest::immediate_node_state_reply_sending_is_tracked_per_controller() {
+ mark_reported_node_state_up();
+ mark_reply_observed_from_n_controllers(3);
+
+ _manager->immediately_send_get_node_state_replies();
+
+ send_down_get_node_state_request(0);
+ send_down_get_node_state_request(1);
+ send_down_get_node_state_request(2);
+ CPPUNIT_ASSERT_EQUAL(size_t(3), _upper->getNumReplies());
+ clear_sent_replies();
+
+ // Sending a new request should now _not_ immediately receive a reply
+ send_down_get_node_state_request(0);
+ send_down_get_node_state_request(1);
+ send_down_get_node_state_request(2);
+ CPPUNIT_ASSERT_EQUAL(size_t(0), _upper->getNumReplies());
}
} // storage