From: Yingxin Cheng Date: Thu, 3 Aug 2023 07:30:10 +0000 (+0800) Subject: crimson/net: support cross-core blocking for interceptor X-Git-Tag: v18.2.1~102^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=cab614c603fae352ddf1b6164a910430da65caca;p=ceph-ci.git crimson/net: support cross-core blocking for interceptor Signed-off-by: Yingxin Cheng (cherry picked from commit bcf20d6771f5adf608fcf44b47073c133c6b0b35) --- diff --git a/src/crimson/net/Interceptor.h b/src/crimson/net/Interceptor.h index 921175cbf94..35b74e24369 100644 --- a/src/crimson/net/Interceptor.h +++ b/src/crimson/net/Interceptor.h @@ -45,16 +45,21 @@ enum class bp_action_t { class socket_blocker { std::optional p_blocked; std::optional p_unblocked; + const seastar::shard_id primary_sid; public: + socket_blocker() : primary_sid{seastar::this_shard_id()} {} + seastar::future<> wait_blocked() { + ceph_assert(seastar::this_shard_id() == primary_sid); ceph_assert(!p_blocked); if (p_unblocked) { return seastar::make_ready_future<>(); } else { p_blocked = seastar::abort_source(); - return seastar::sleep_abortable(std::chrono::seconds(10), - *p_blocked).then([] { + return seastar::sleep_abortable( + std::chrono::seconds(10), *p_blocked + ).then([] { throw std::runtime_error( "Timeout (10s) in socket_blocker::wait_blocked()"); }).handle_exception_type([] (const seastar::sleep_aborted& e) { @@ -64,21 +69,25 @@ class socket_blocker { } seastar::future<> block() { - if (p_blocked) { - p_blocked->request_abort(); - p_blocked = std::nullopt; - } - ceph_assert(!p_unblocked); - p_unblocked = seastar::abort_source(); - return seastar::sleep_abortable(std::chrono::seconds(10), - *p_unblocked).then([] { - ceph_abort("Timeout (10s) in socket_blocker::block()"); - }).handle_exception_type([] (const seastar::sleep_aborted& e) { - // wait done! + return seastar::smp::submit_to(primary_sid, [this] { + if (p_blocked) { + p_blocked->request_abort(); + p_blocked = std::nullopt; + } + ceph_assert(!p_unblocked); + p_unblocked = seastar::abort_source(); + return seastar::sleep_abortable( + std::chrono::seconds(10), *p_unblocked + ).then([] { + ceph_abort("Timeout (10s) in socket_blocker::block()"); + }).handle_exception_type([] (const seastar::sleep_aborted& e) { + // wait done! + }); }); } void unblock() { + ceph_assert(seastar::this_shard_id() == primary_sid); ceph_assert(!p_blocked); ceph_assert(p_unblocked); p_unblocked->request_abort();