]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncConnection: make send_message directly send message possibly
authorHaomai Wang <haomaiwang@gmail.com>
Tue, 30 Sep 2014 02:44:13 +0000 (10:44 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Wed, 8 Oct 2014 06:05:00 +0000 (14:05 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/AsyncConnection.cc

index 855a2375080cf0d53886720d54a6e2f4a7d0519a..a9f421b71bad2960809a32a3ec195e1209896146 100644 (file)
@@ -1640,13 +1640,23 @@ int AsyncConnection::send_message(Message *m)
     m->set_priority(async_msgr->get_default_send_priority());
 
   Mutex::Locker l(lock);
-  out_q[m->get_priority()].push_back(m);
-  if ((state == STATE_STANDBY || state == STATE_CLOSED) && !policy.server) {
-    ldout(async_msgr->cct, 10) << __func__ << " state is " << get_state_name(state)
-                               << " policy.server is false" << dendl;
-    _connect();
-  } else if (sd > 0 && !open_write) {
-    center->dispatch_event_external(write_handler);
+  if (!is_queued() && state >= STATE_OPEN && state <= STATE_OPEN_TAG_CLOSE) {
+    ldout(async_msgr->cct, 10) << __func__ << " try send msg " << m << dendl;
+    int r = _send(m);
+    if (r < 0) {
+      ldout(async_msgr->cct, 1) << __func__ << " send msg failed" << dendl;
+      // we want to handle fault within internal thread
+      center->dispatch_event_external(write_handler);
+    }
+  } else {
+    out_q[m->get_priority()].push_back(m);
+    if ((state == STATE_STANDBY || state == STATE_CLOSED) && !policy.server) {
+      ldout(async_msgr->cct, 10) << __func__ << " state is " << get_state_name(state)
+                                 << " policy.server is false" << dendl;
+      _connect();
+    } else if (sd > 0 && !open_write) {
+      center->dispatch_event_external(write_handler);
+    }
   }
   return 0;
 }