From f7d25e6baecf2e1277da0c7f0dc86ff469f732e8 Mon Sep 17 00:00:00 2001 From: Asias He Date: Thu, 2 Jun 2016 10:40:09 +0800 Subject: [PATCH 1/3] messaging_service: Handle _server is not created in foreach_server_connection_stats It is possible _server is not created yet when foreach_server_connection_stats is called. Handle this case. --- message/messaging_service.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/message/messaging_service.cc b/message/messaging_service.cc index eb5945c8f9..2515fb492c 100644 --- a/message/messaging_service.cc +++ b/message/messaging_service.cc @@ -176,9 +176,11 @@ void messaging_service::foreach_client(std::function&& f) const { - _server->foreach_connection([f](const rpc_protocol::server::connection& c) { - f(c.info(), c.get_stats()); - }); + if (_server) { + _server->foreach_connection([f](const rpc_protocol::server::connection& c) { + f(c.info(), c.get_stats()); + }); + } } void messaging_service::increment_dropped_messages(messaging_verb verb) { From e6f63a50e16408fe20a643fdcee123492e92888f Mon Sep 17 00:00:00 2001 From: Asias He Date: Tue, 7 Jun 2016 18:17:36 +0800 Subject: [PATCH 2/3] main: Delay the messaging_service api registration Since messaging_service is fully initialized in storage_service::init_server which calls messaging_service::start_listen, we need to delay the messaging_service api registration after it. --- main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cc b/main.cc index 0f8cb2dba4..f344d6b84d 100644 --- a/main.cc +++ b/main.cc @@ -540,7 +540,6 @@ int main(int ac, char** av) { api::set_server_storage_service(ctx).get(); api::set_server_gossip(ctx).get(); api::set_server_snitch(ctx).get(); - api::set_server_messaging_service(ctx).get(); api::set_server_storage_proxy(ctx).get(); api::set_server_load_sstable(ctx).get(); supervisor_notify("initializing migration manager RPC verbs"); @@ -566,6 +565,7 @@ int main(int ac, char** av) { supervisor_notify("starting storage service", true); auto& ss = service::get_local_storage_service(); ss.init_server().get(); + api::set_server_messaging_service(ctx).get(); api::set_server_storage_service(ctx).get(); supervisor_notify("starting batchlog manager"); db::get_batchlog_manager().invoke_on_all([] (db::batchlog_manager& b) { From b36d3be5d42bacfcb92a734f3b1e378377de5f9f Mon Sep 17 00:00:00 2001 From: Asias He Date: Tue, 31 May 2016 21:03:14 +0800 Subject: [PATCH 3/3] messaging_service: Fix messaging_service::stop There are two problems: 1. _server_tls is not stopped 2. _server and _server_tls might not be created if messaging_service::start_listen is not called yet. --- message/messaging_service.cc | 31 +++++++++++++++++++++++-------- message/messaging_service.hh | 3 +++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/message/messaging_service.cc b/message/messaging_service.cc index 2515fb492c..c97c2ba03b 100644 --- a/message/messaging_service.cc +++ b/message/messaging_service.cc @@ -300,16 +300,31 @@ gms::inet_address messaging_service::listen_address() { return _listen_address; } +future<> messaging_service::stop_tls_server() { + if (_server_tls) { + return _server_tls->stop(); + } + return make_ready_future<>(); +} + +future<> messaging_service::stop_nontls_server() { + if (_server) { + return _server->stop(); + } + return make_ready_future<>(); +} + +future<> messaging_service::stop_client() { + return parallel_for_each(_clients, [] (auto& m) { + return parallel_for_each(m, [] (std::pair& c) { + return c.second.rpc_client->stop(); + }); + }); +} + future<> messaging_service::stop() { _stopping = true; - return when_all( - _server->stop(), - parallel_for_each(_clients, [] (auto& m) { - return parallel_for_each(m, [] (std::pair& c) { - return c.second.rpc_client->stop(); - }); - }) - ).discard_result(); + return when_all(stop_nontls_server(), stop_tls_server(), stop_client()).discard_result(); } rpc::no_wait_type messaging_service::no_wait() { diff --git a/message/messaging_service.hh b/message/messaging_service.hh index eab4052717..5b19286bc1 100644 --- a/message/messaging_service.hh +++ b/message/messaging_service.hh @@ -194,6 +194,9 @@ public: void start_listen(); uint16_t port(); gms::inet_address listen_address(); + future<> stop_tls_server(); + future<> stop_nontls_server(); + future<> stop_client(); future<> stop(); static rpc::no_wait_type no_wait(); bool is_stopping() { return _stopping; }