]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async/AsyncConnection: shorter handshake step deps
authorHaomai Wang <haomai@xsky.com>
Sun, 19 Jun 2016 18:32:10 +0000 (02:32 +0800)
committerHaomai Wang <haomai@xsky.com>
Tue, 21 Jun 2016 14:07:54 +0000 (22:07 +0800)
Originally connect side will wait for accept side sending banner, actually
we don't need this logic to ensure anything.

So connect side will issue banner after tcp handshake straightway. It will
help for reducing session handshake period, then it avoid peer side drop this
connection in low level but connect side don't know right now.

Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/AsyncConnection.cc
src/msg/async/AsyncConnection.h

index 71ea16848885c391758f61eb0aba7ec50974bb77..79403d0bcd38db956a9e61272f1c17ffb3580996 100644 (file)
@@ -1008,61 +1008,49 @@ ssize_t AsyncConnection::_process_connection()
         }
 
         center->delete_file_event(sd, EVENT_WRITABLE);
-        state = STATE_CONNECTING_WAIT_BANNER;
-        break;
-      }
-
-    case STATE_CONNECTING_WAIT_BANNER:
-      {
-        r = read_until(strlen(CEPH_BANNER), state_buffer);
-        if (r < 0) {
-          ldout(async_msgr->cct, 1) << __func__ << " read banner failed" << dendl;
-          goto fail;
-        } else if (r > 0) {
-          break;
-        }
-
-        if (memcmp(state_buffer, CEPH_BANNER, strlen(CEPH_BANNER))) {
-          ldout(async_msgr->cct, 0) << __func__ << " connect protocol error (bad banner) on peer "
-                              << get_peer_addr() << dendl;
-          goto fail;
-        }
-
-        ldout(async_msgr->cct, 10) << __func__ << " get banner, ready to send banner" << dendl;
+        ldout(async_msgr->cct, 10) << __func__ << " connect successfully, ready to send banner" << dendl;
 
         bufferlist bl;
-        bl.append(state_buffer, strlen(CEPH_BANNER));
+        bl.append(CEPH_BANNER, strlen(CEPH_BANNER));
         r = try_send(bl);
         if (r == 0) {
-          state = STATE_CONNECTING_WAIT_IDENTIFY_PEER;
+          state = STATE_CONNECTING_WAIT_BANNER_AND_IDENTIFY;
           ldout(async_msgr->cct, 10) << __func__ << " connect write banner done: "
-                               << get_peer_addr() << dendl;
+                                     << get_peer_addr() << dendl;
         } else if (r > 0) {
           state = STATE_WAIT_SEND;
-          state_after_send = STATE_CONNECTING_WAIT_IDENTIFY_PEER;
+          state_after_send = STATE_CONNECTING_WAIT_BANNER_AND_IDENTIFY;
           ldout(async_msgr->cct, 10) << __func__ << " connect wait for write banner: "
                                << get_peer_addr() << dendl;
         } else {
           goto fail;
         }
+
         break;
       }
 
-    case STATE_CONNECTING_WAIT_IDENTIFY_PEER:
+    case STATE_CONNECTING_WAIT_BANNER_AND_IDENTIFY:
       {
         entity_addr_t paddr, peer_addr_for_me;
         bufferlist myaddrbl;
-
-        r = read_until(sizeof(ceph_entity_addr)*2, state_buffer);
+        unsigned banner_len = strlen(CEPH_BANNER);
+        unsigned need_len = banner_len + sizeof(ceph_entity_addr)*2;
+        r = read_until(need_len, state_buffer);
         if (r < 0) {
-          ldout(async_msgr->cct, 1) << __func__ << " read identify peeraddr failed" << dendl;
+          ldout(async_msgr->cct, 1) << __func__ << " read banner and identify addresses failed" << dendl;
           goto fail;
         } else if (r > 0) {
           break;
         }
 
+        if (memcmp(state_buffer, CEPH_BANNER, banner_len)) {
+          ldout(async_msgr->cct, 0) << __func__ << " connect protocol error (bad banner) on peer "
+                                    << get_peer_addr() << dendl;
+          goto fail;
+        }
+
         bufferlist bl;
-        bl.append(state_buffer, sizeof(ceph_entity_addr)*2);
+        bl.append(state_buffer+banner_len, sizeof(ceph_entity_addr)*2);
         bufferlist::iterator p = bl.begin();
         try {
           ::decode(paddr, p);
@@ -1100,7 +1088,7 @@ ssize_t AsyncConnection::_process_connection()
         }
 
         lock.Lock();
-        if (state != STATE_CONNECTING_WAIT_IDENTIFY_PEER) {
+        if (state != STATE_CONNECTING_WAIT_BANNER_AND_IDENTIFY) {
           ldout(async_msgr->cct, 1) << __func__ << " state changed while learned_addr, mark_down or "
                                     << " replacing must be happened just now" << dendl;
           return 0;
index 81034515685e6a490df14307622e31029c706a13..7dd76c1a3780be8bc72c26b6b4732eceb50bc942 100644 (file)
@@ -224,8 +224,7 @@ class AsyncConnection : public Connection {
     STATE_WAIT_SEND,
     STATE_CONNECTING,
     STATE_CONNECTING_RE,
-    STATE_CONNECTING_WAIT_BANNER,
-    STATE_CONNECTING_WAIT_IDENTIFY_PEER,
+    STATE_CONNECTING_WAIT_BANNER_AND_IDENTIFY,
     STATE_CONNECTING_SEND_CONNECT_MSG,
     STATE_CONNECTING_WAIT_CONNECT_REPLY,
     STATE_CONNECTING_WAIT_CONNECT_REPLY_AUTH,
@@ -262,8 +261,7 @@ class AsyncConnection : public Connection {
                                         "STATE_WAIT_SEND",
                                         "STATE_CONNECTING",
                                         "STATE_CONNECTING_RE",
-                                        "STATE_CONNECTING_WAIT_BANNER",
-                                        "STATE_CONNECTING_WAIT_IDENTIFY_PEER",
+                                        "STATE_CONNECTING_WAIT_BANNER_AND_IDENTIFY",
                                         "STATE_CONNECTING_SEND_CONNECT_MSG",
                                         "STATE_CONNECTING_WAIT_CONNECT_REPLY",
                                         "STATE_CONNECTING_WAIT_CONNECT_REPLY_AUTH",