]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncMessenger: Fix leak memory 3219/head
authorHaomai Wang <haomaiwang@gmail.com>
Tue, 23 Dec 2014 12:27:05 +0000 (20:27 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Tue, 23 Dec 2014 13:09:09 +0000 (21:09 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/async/AsyncConnection.cc
src/msg/async/AsyncMessenger.cc

index 881db821db45509850f9b28de2d4eb06dd9982b2..ef5d04597179c661f8eb0871956b0902a5a568f8 100644 (file)
@@ -1499,8 +1499,8 @@ int AsyncConnection::handle_connect_msg(ceph_msg_connect &connect, bufferlist &a
     }
 
     ldout(async_msgr->cct, 0) << __func__ << "accept connect_seq " << connect.connect_seq
-                        << " vs existing " << existing->connect_seq
-                        << " state " << existing->state << dendl;
+                              << " vs existing " << existing->connect_seq
+                              << " state " << existing->state << dendl;
 
     if (connect.connect_seq == 0 && existing->connect_seq > 0) {
       ldout(async_msgr->cct,0) << __func__ << " accept peer reset, then tried to connect to us, replacing" << dendl;
index 6886fe6e2a9af2691a4f1291c8a972f24b9f7936..b6ba1446bc25fe0f284e58e943fbc1c85977e220 100644 (file)
@@ -465,20 +465,7 @@ void AsyncMessenger::wait()
   ldout(cct,20) << __func__ << ": stopped processor thread" << dendl;
 
   // close all connections
-  lock.Lock();
-  {
-    ldout(cct, 10) << __func__ << ": closing connections" << dendl;
-
-    while (!conns.empty()) {
-      ceph::unordered_map<entity_addr_t, AsyncConnectionRef>::iterator it = conns.begin();
-      AsyncConnectionRef p = it->second;
-      ldout(cct, 5) << __func__ << " " << it->first << " " << p << dendl;
-      conns.erase(it);
-      p->mark_down();
-      ms_deliver_handle_reset(p.get());
-    }
-  }
-  lock.Unlock();
+  mark_down_all();
 
   ldout(cct, 10) << __func__ << ": done." << dendl;
   ldout(cct, 1) << __func__ << " complete." << dendl;
@@ -635,11 +622,19 @@ void AsyncMessenger::mark_down_all()
   while (!conns.empty()) {
     ceph::unordered_map<entity_addr_t, AsyncConnectionRef>::iterator it = conns.begin();
     AsyncConnectionRef p = it->second;
-    ldout(cct, 5) << __func__ << " " << it->first << " " << p << dendl;
+    ldout(cct, 5) << __func__ << " mark down " << it->first << " " << p << dendl;
     conns.erase(it);
     p->mark_down();
     ms_deliver_handle_reset(p.get());
   }
+
+  while (!deleted_conns.empty()) {
+    set<AsyncConnectionRef>::iterator it = deleted_conns.begin();
+    AsyncConnectionRef p = *it;
+    ldout(cct, 5) << __func__ << " delete " << p << dendl;
+    p->put();
+    deleted_conns.erase(it);
+  }
   lock.Unlock();
 }