From: Ilya Dryomov Date: Thu, 12 Dec 2024 20:32:39 +0000 (+0100) Subject: librbd/migration/HttpClient: socket isn't shut down on some state transitions X-Git-Tag: v19.2.1~15^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F61095%2Fhead;p=ceph.git librbd/migration/HttpClient: socket isn't shut down on some state transitions If shut_down() gets delayed until a) the state transition from STATE_RESET_CONNECTING completes and the reconnect is unsuccessful or b) the state transition from STATE_RESET_DISCONNECTING completes (i.e. next_state is STATE_UNINITIALIZED or STATE_RESET_CONNECTING), the socket needs to be shut down before m_on_shutdown is invoked. The line of thought here is the same as for the corresponding state transitions that don't involve STATE_SHUTTING_DOWN. Signed-off-by: Ilya Dryomov (cherry picked from commit 88557dff2fe14c7df96992fbb0a5208979c20bf1) --- diff --git a/src/librbd/migration/HttpClient.cc b/src/librbd/migration/HttpClient.cc index a55c2dd0480f..09fe91da02ae 100644 --- a/src/librbd/migration/HttpClient.cc +++ b/src/librbd/migration/HttpClient.cc @@ -514,14 +514,17 @@ private: return; } } else if (current_state == STATE_SHUTTING_DOWN) { + ceph_assert(m_on_shutdown != nullptr); if (next_state == STATE_READY) { // shut down requested while connecting/resetting disconnect(new LambdaContext([this](int r) { handle_shut_down(r); })); return; } else if (next_state == STATE_UNINITIALIZED || - next_state == STATE_SHUTDOWN || next_state == STATE_RESET_CONNECTING) { - ceph_assert(m_on_shutdown != nullptr); + shutdown_socket(); + m_on_shutdown->complete(r); + return; + } else if (next_state == STATE_SHUTDOWN) { m_on_shutdown->complete(r); return; }