From a99435d06d923462ca9277d4a55d8a851c647ffc Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 5 Jun 2013 08:53:38 -0700 Subject: [PATCH] mon: fix leak of loopback Connection The accessor returns a reference. Instead of taking+dropping it each time, take one ref in Monitor ctor and release it in the dtor. Signed-off-by: Sage Weil --- src/mon/Monitor.cc | 3 +++ src/mon/Monitor.h | 1 + src/mon/PaxosService.cc | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 72fd3777a8cac..dbd02d5bd782b 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -119,6 +119,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s, name(nm), rank(-1), messenger(m), + con_self(m ? m->get_loopback_connection() : NULL), lock("Monitor::lock"), timer(cct_, lock), has_ever_joined(false), @@ -208,6 +209,8 @@ Monitor::~Monitor() delete paxos; assert(session_map.sessions.empty()); delete mon_caps; + if (con_self) + con_self->put(); } diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index b9203ae1e6150..f84efe379b54f 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -108,6 +108,7 @@ public: string name; int rank; Messenger *messenger; + Connection *con_self; Mutex lock; SafeTimer timer; diff --git a/src/mon/PaxosService.cc b/src/mon/PaxosService.cc index 8840fcecc3576..c32e77fee31aa 100644 --- a/src/mon/PaxosService.cc +++ b/src/mon/PaxosService.cc @@ -48,7 +48,7 @@ bool PaxosService::dispatch(PaxosServiceMessage *m) // connection will be disconnected with a null message; don't drop // those. also ignore loopback (e.g., log) messages. if (!m->get_connection()->is_connected() && - m->get_connection() != mon->messenger->get_loopback_connection() && + m->get_connection() != mon->con_self && m->get_connection()->get_messenger() != NULL) { dout(10) << " discarding message from disconnected client " << m->get_source_inst() << " " << *m << dendl; -- 2.39.5