From be8dec5597c5227f45f82e38c0361a77ea57cf2a Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Sun, 26 Jun 2016 23:07:18 +0800 Subject: [PATCH] msg/async/AsyncConnection: avoid dup RETRYGLOBAL sending if two accept all going to dispatch RETRYGLOBAL sending, it will cause invalid connect side receiver. Signed-off-by: Haomai Wang --- src/msg/async/AsyncConnection.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index 7e14ff5df45a..6f7a38d0acc1 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -1832,15 +1832,18 @@ ssize_t AsyncConnection::handle_connect_msg(ceph_msg_connect &connect, bufferlis _stop(); // queue a reset on the new connection, which we're dumping for the old dispatch_queue->queue_reset(this); - existing->lock.Unlock(); - - center->submit_to(existing->center->get_id(), [existing, connect, reply, authorizer_reply]() mutable { + int new_fd = existing->sd; + center->submit_to(existing->center->get_id(), [existing, new_fd, connect, reply, authorizer_reply]() mutable { Mutex::Locker l(existing->lock); + if (new_fd != existing->sd) + return ; + if (existing->_reply_accept(CEPH_MSGR_TAG_RETRY_GLOBAL, connect, reply, authorizer_reply) < 0) { // handle error existing->fault(); } }, true); + existing->lock.Unlock(); return 0; } -- 2.47.3