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 <idryomov@gmail.com>
(cherry picked from commit
88557dff2fe14c7df96992fbb0a5208979c20bf1)
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;
}