From 4d1989dc229a7f0a5f83ff1faf9d766c20ab73a8 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 28 Feb 2017 05:42:58 +0000 Subject: [PATCH] mgr/MgrClient: use unique_ptr for MgrClient::session * use unique_ptr for MgrClient::session, so we don't leak it. * also reset it in MgrClient::shutdown(), so the connection held by session can be released properly, and hence the MonClient will not be asked for an AuthAuthorizer after being shut down. Fixes: http://tracker.ceph.com/issues/19097 Signed-off-by: Kefu Chai --- src/mgr/MgrClient.cc | 13 ++++++------- src/mgr/MgrClient.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/mgr/MgrClient.cc b/src/mgr/MgrClient.cc index 157baa9b8e2..d18160ba4e0 100644 --- a/src/mgr/MgrClient.cc +++ b/src/mgr/MgrClient.cc @@ -31,7 +31,6 @@ MgrClient::MgrClient(CephContext *cct_, Messenger *msgr_) : Dispatcher(cct_), cct(cct_), msgr(msgr_), - session(nullptr), lock("mgrc"), timer(cct_, lock), report_callback(nullptr) @@ -53,6 +52,7 @@ void MgrClient::shutdown() Mutex::Locker l(lock); timer.shutdown(); + session.reset(); } bool MgrClient::ms_dispatch(Message *m) @@ -85,8 +85,7 @@ void MgrClient::reconnect() ldout(cct, 4) << "Terminating session with " << session->con->get_peer_addr() << dendl; session->con->mark_down(); - delete session; - session = nullptr; + session.reset(); stats_period = 0; if (report_callback != nullptr) { timer.cancel_event(report_callback); @@ -114,7 +113,7 @@ void MgrClient::reconnect() inst.addr = map.get_active_addr(); inst.name = entity_name_t::MGR(map.get_active_gid()); - session = new MgrSessionState(); + session.reset(new MgrSessionState()); session->con = msgr->get_connection(inst); // Don't send an open if we're just a client (i.e. doing @@ -144,7 +143,7 @@ bool MgrClient::handle_mgr_map(MMgrMap *m) ldout(cct, 4) << "Active mgr is now " << map.get_active_addr() << dendl; // Reset session? - if (session == nullptr || + if (!session || session->con->get_peer_addr() != map.get_active_addr()) { reconnect(); } @@ -245,7 +244,7 @@ bool MgrClient::handle_mgr_configure(MMgrConfigure *m) ldout(cct, 20) << *m << dendl; - if (session == nullptr) { + if (!session) { lderr(cct) << "dropping unexpected configure message" << dendl; m->put(); return true; @@ -287,7 +286,7 @@ int MgrClient::start_command(const vector& cmd, const bufferlist& inbl, ldout(cct, 20) << "cmd: " << cmd << dendl; - if (session == nullptr) { + if (!session) { lderr(cct) << "no session, waiting" << dendl; wait_on_list(waiting_for_session); } diff --git a/src/mgr/MgrClient.h b/src/mgr/MgrClient.h index e18c2c0940d..a34ee2e951e 100644 --- a/src/mgr/MgrClient.h +++ b/src/mgr/MgrClient.h @@ -54,7 +54,7 @@ protected: MgrMap map; Messenger *msgr; - MgrSessionState *session; + unique_ptr session; Mutex lock; -- 2.39.5