diff --git a/src/net/tls.cc b/src/net/tls.cc index bc8f79f0d98..9c918a5c2b9 100644 --- a/src/net/tls.cc +++ b/src/net/tls.cc @@ -24,6 +24,7 @@ module; #endif #include +#include #include #include #include @@ -1594,26 +1595,32 @@ class session : public enable_lw_shared_from_this { auto me = shared_from_this(); // running in background. try to bye-handshake us nicely, but after 10s we forcefully close. engine().run_in_background(with_timeout(timer<>::clock::now() + std::chrono::seconds(10), shutdown()).finally([this] { - _eof = true; - try { - (void)_in.close().handle_exception([](std::exception_ptr) {}); // should wake any waiters - } catch (...) { - } - try { - (void)_out.close().handle_exception([](std::exception_ptr) {}); - } catch (...) { - } - // make sure to wait for handshake attempt to leave semaphores. Must be in same order as - // handshake aqcuire, because in worst case, we get here while a reader is attempting - // re-handshake. - return with_semaphore(_in_sem, 1, [this] { - return with_semaphore(_out_sem, 1, [] {}); - }); + return close_after_shutdown(); }).then_wrapped([me = std::move(me)](future<> f) { // must keep object alive until here. f.ignore_ready_future(); })); } } + + future<> close_after_shutdown() { + _eof = true; + try { + co_await _in.close(); // should wake any waiters + } catch (...) { + } + try { + co_await _out.close(); + } catch (...) { + } + + // make sure to wait for handshake attempt to leave semaphores. Must be in same order as + // handshake aqcuire, because in worst case, we get here while a reader is attempting + // re-handshake. + co_await with_semaphore(_in_sem, 1, [this] { + return with_semaphore(_out_sem, 1, [] {}); + }); + } + // helper for sink future<> flush() noexcept { return with_semaphore(_out_sem, 1, [this] {