]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncConnection: Dont send message when local connection is closed 7255/head
authorHaomai Wang <haomai@xsky.com>
Sat, 16 Jan 2016 04:44:50 +0000 (12:44 +0800)
committerHaomai Wang <haomai@xsky.com>
Sat, 16 Jan 2016 04:46:49 +0000 (12:46 +0800)
Fix: #14386
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/AsyncConnection.cc

index 52240965c4b5e57e34a85cf8da447732dbb4937c..cfd34713e8a7d6d675e5d9b5ed1f893329d83b1f 100644 (file)
@@ -2027,11 +2027,17 @@ int AsyncConnection::send_message(Message *m)
   m->set_connection(this);
 
   if (async_msgr->get_myaddr() == get_peer_addr()) { //loopback connection
-   ldout(async_msgr->cct, 20) << __func__ << " " << *m << " local" << dendl;
-   Mutex::Locker l(write_lock);
-   local_messages.push_back(m);
-   center->dispatch_event_external(local_deliver_handler);
-   return 0;
+    ldout(async_msgr->cct, 20) << __func__ << " " << *m << " local" << dendl;
+    Mutex::Locker l(write_lock);
+    if (can_write != CLOSED) {
+      local_messages.push_back(m);
+      center->dispatch_event_external(local_deliver_handler);
+    } else {
+      ldout(async_msgr->cct, 10) << __func__ << " loopback connection closed."
+                                 << " Drop message " << m << dendl;
+      m->put();
+    }
+    return 0;
   }
 
   // we don't want to consider local message here, it's too lightweight which