diff --git a/src/crimson/mgr/client.cc b/src/crimson/mgr/client.cc index 3b33c176b6a..18c60e7eb40 100644 --- a/src/crimson/mgr/client.cc +++ b/src/crimson/mgr/client.cc @@ -58,13 +58,26 @@ seastar::future<> Client::ms_dispatch(crimson::net::Connection* conn, } } +seastar::future<> Client::ms_handle_connect(crimson::net::ConnectionRef c) +{ + if (conn == c) { + // ask for the mgrconfigure message + auto m = ceph::make_message(); + m->daemon_name = local_conf()->name.get_id(); + return conn->send(std::move(m)); + } else { + return seastar::now(); + } +} + seastar::future<> Client::ms_handle_reset(crimson::net::ConnectionRef c) { if (conn == c) { - conn = nullptr; report_timer.cancel(); + return reconnect(); + } else { + return seastar::now(); } - return seastar::now(); } seastar::future<> Client::reconnect() @@ -72,17 +85,20 @@ seastar::future<> Client::reconnect() if (conn) { // crimson::net::Protocol::close() is able to close() in background (void)conn->close(); + conn = {}; } if (!mgrmap.get_available()) { logger().warn("No active mgr available yet"); return seastar::now(); } - auto peer = mgrmap.get_active_addrs().front(); - conn = msgr.connect(peer, CEPH_ENTITY_TYPE_MGR); - // ask for the mgrconfigure message - auto m = ceph::make_message(); - m->daemon_name = local_conf()->name.get_id(); - return conn->send(std::move(m)); + auto retry_interval = std::chrono::duration( + local_conf().get_val("mgr_connect_retry_interval")); + auto a_while = std::chrono::duration_cast( + retry_interval); + return seastar::sleep(a_while).then([this] { + auto peer = mgrmap.get_active_addrs().front(); + conn = msgr.connect(peer, CEPH_ENTITY_TYPE_MGR); + }); } seastar::future<> Client::handle_mgr_map(crimson::net::Connection*, @@ -120,12 +136,9 @@ seastar::future<> Client::handle_mgr_conf(crimson::net::Connection* conn, void Client::report() { (void) seastar::with_gate(gate, [this] { - if (conn) { - auto pg_stats = with_stats.get_stats(); - return conn->send(std::move(pg_stats)); - } else { - return reconnect(); - } + assert(conn); + auto pg_stats = with_stats.get_stats(); + return conn->send(std::move(pg_stats)); }); } diff --git a/src/crimson/mgr/client.h b/src/crimson/mgr/client.h index 0a7048eed3e..099a504f08f 100644 --- a/src/crimson/mgr/client.h +++ b/src/crimson/mgr/client.h @@ -39,7 +39,8 @@ public: private: seastar::future<> ms_dispatch(crimson::net::Connection* conn, Ref m) override; - seastar::future<> ms_handle_reset(crimson::net::ConnectionRef conn) override; + seastar::future<> ms_handle_reset(crimson::net::ConnectionRef conn) final; + seastar::future<> ms_handle_connect(crimson::net::ConnectionRef conn) final; seastar::future<> handle_mgr_map(crimson::net::Connection* conn, Ref m); seastar::future<> handle_mgr_conf(crimson::net::Connection* conn,