Although it is not necessary to mark_down the connection in its
ms_handle_reset() event, but it can be more convenient to allow it.
And Heartbeat already encounters this assertion failure.
So move the assertion to close_clean() which will help identify problems
if we happen to make ms_handle_reset() wait for messenger shutdown.
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
{
if (closed) {
// already closing
- assert(close_ready.valid());
return;
}
#endif
};
- // close_ready become valid only after state is state_t::closing
- assert(!close_ready.valid());
-
// atomic operations
+ closed = true;
trigger_close();
if (f_accept_new) {
(*f_accept_new)();
if (socket) {
socket->shutdown();
}
- closed = true;
set_write_state(write_state_t::drop);
auto gate_closed = pending_dispatch.close();
auto reset_dispatched = seastar::futurize_apply([this, dispatch_reset] {
});
// asynchronous operations
+ assert(!close_ready.valid());
close_ready = seastar::when_all_succeed(
std::move(gate_closed).finally([this] {
if (socket) {
void close(bool dispatch_reset, std::optional<std::function<void()>> f_accept_new=std::nullopt);
seastar::future<> close_clean(bool dispatch_reset) {
close(dispatch_reset);
+ // it can happen if close_clean() is called inside Dispatcher::ms_handle_reset()
+ // which will otherwise result in deadlock
+ assert(close_ready.valid());
return close_ready.get_future();
}