From c0ed141d4d53d3ee6994a1c6fb481baf05a90c1d Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Fri, 6 Sep 2019 12:47:32 +0800 Subject: [PATCH] crimson/net: always dispatch accept when replaced/accepted Fix issues of missing dispatches of accept event during connection racing. Signed-off-by: Yingxin Cheng --- src/crimson/net/ProtocolV2.cc | 16 +++++++--------- src/test/crimson/test_messenger.cc | 16 ++++++++++------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/crimson/net/ProtocolV2.cc b/src/crimson/net/ProtocolV2.cc index 537c0af0b99..2509271ef39 100644 --- a/src/crimson/net/ProtocolV2.cc +++ b/src/crimson/net/ProtocolV2.cc @@ -1761,15 +1761,13 @@ void ProtocolV2::trigger_replacing(bool reconnect, if (socket) { socket->shutdown(); } - if (!reconnect && new_client_cookie != client_cookie) { - seastar::with_gate(pending_dispatch, [this] { - return dispatcher.ms_handle_accept( - seastar::static_pointer_cast(conn.shared_from_this())); - }).handle_exception([this] (std::exception_ptr eptr) { - logger().error("{} ms_handle_accept caught exception: {}", conn, eptr); - ceph_abort("unexpected exception from ms_handle_accept()"); - }); - } + seastar::with_gate(pending_dispatch, [this] { + return dispatcher.ms_handle_accept( + seastar::static_pointer_cast(conn.shared_from_this())); + }).handle_exception([this] (std::exception_ptr eptr) { + logger().error("{} ms_handle_accept caught exception: {}", conn, eptr); + ceph_abort("unexpected exception from ms_handle_accept()"); + }); seastar::with_gate(pending_dispatch, [this, reconnect, diff --git a/src/test/crimson/test_messenger.cc b/src/test/crimson/test_messenger.cc index ef9fac9332a..c3ba1dd3154 100644 --- a/src/test/crimson/test_messenger.cc +++ b/src/test/crimson/test_messenger.cc @@ -2010,7 +2010,7 @@ test_v2_lossless_establishing_fault(FailoverTest& test) { }).then([] (ConnResults& results) { results[0].assert_state_at(conn_state_t::established); results[0].assert_connect(0, 0, 0, 0); - results[0].assert_accept(1, 1, 0, 1); + results[0].assert_accept(1, 1, 0, 2); results[0].assert_reset(0, 0); results[1].assert_state_at(conn_state_t::replaced); results[1].assert_connect(0, 0, 0, 0); @@ -2044,7 +2044,7 @@ test_v2_lossless_accepted_fault(FailoverTest& test) { }).then([] (ConnResults& results) { results[0].assert_state_at(conn_state_t::established); results[0].assert_connect(0, 0, 0, 0); - results[0].assert_accept(1, 1, 0, 1); + results[0].assert_accept(1, 1, 0, 2); results[0].assert_reset(0, 0); results[1].assert_state_at(conn_state_t::replaced); results[1].assert_connect(0, 0, 0, 0); @@ -2084,7 +2084,11 @@ test_v2_lossless_reaccept_fault(FailoverTest& test) { }).then([bp] (ConnResults& results) { results[0].assert_state_at(conn_state_t::established); results[0].assert_connect(0, 0, 0, 0); - results[0].assert_accept(1, 1, 0, 1); + if (bp == Breakpoint{Tag::SESSION_RECONNECT, bp_type_t::READ}) { + results[0].assert_accept(1, 1, 0, 2); + } else { + results[0].assert_accept(1, 1, 0, 3); + } results[0].assert_reset(0, 0); if (bp == Breakpoint{Tag::SESSION_RECONNECT, bp_type_t::READ}) { results[1].assert_state_at(conn_state_t::closed); @@ -2186,7 +2190,7 @@ test_v2_peer_establishing_fault(FailoverTest& test) { }).then([] (ConnResults& results) { results[0].assert_state_at(conn_state_t::established); results[0].assert_connect(0, 0, 0, 0); - results[0].assert_accept(1, 1, 0, 1); + results[0].assert_accept(1, 1, 0, 2); results[0].assert_reset(0, 0); results[1].assert_state_at(conn_state_t::replaced); results[1].assert_connect(0, 0, 0, 0); @@ -2242,7 +2246,7 @@ test_v2_peer_connected_fault_reaccept(FailoverTest& test) { }).then([] (ConnResults& results) { results[0].assert_state_at(conn_state_t::established); results[0].assert_connect(1, 1, 0, 1); - results[0].assert_accept(0, 0, 0, 0); + results[0].assert_accept(0, 0, 0, 1); results[0].assert_reset(0, 0); results[1].assert_state_at(conn_state_t::replaced); results[1].assert_connect(0, 0, 0, 0); @@ -2369,7 +2373,7 @@ test_v2_racing_reconnect_lose(FailoverTest& test) { results[0].assert_state_at(conn_state_t::established); ceph_assert(results[0].connect_attempts == 2); ceph_assert(results[0].cnt_connect_dispatched == 1); - results[0].assert_accept(0, 0, 0, 0); + results[0].assert_accept(0, 0, 0, 1); results[0].assert_reset(0, 0); results[1].assert_state_at(conn_state_t::replaced); results[1].assert_connect(0, 0, 0, 0); -- 2.39.5