From: Haomai Wang Date: Sun, 19 Jun 2016 18:32:10 +0000 (+0800) Subject: msg/async/AsyncConnection: shorter handshake step deps X-Git-Tag: v11.0.0~78^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6f22bb93620f444462fa0777d27d4a1462c7cb8a;p=ceph.git msg/async/AsyncConnection: shorter handshake step deps 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 --- diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index 71ea16848885..79403d0bcd38 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -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; diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index 81034515685e..7dd76c1a3780 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -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",