From a8279ed7c80d0df0d0f0b5318677b79c55555958 Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Sat, 11 Dec 2021 22:16:36 -0800 Subject: [PATCH] crimson/osd: fix interruptor assert when no pg in peering_event when no pg created, can't use interruptor Signed-off-by: chunmei-liu --- .../osd/osd_operations/peering_event.cc | 21 +++++++++++++------ .../osd/osd_operations/peering_event.h | 2 ++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/crimson/osd/osd_operations/peering_event.cc b/src/crimson/osd/osd_operations/peering_event.cc index 398fc945a09..a43fb8d2c3e 100644 --- a/src/crimson/osd/osd_operations/peering_event.cc +++ b/src/crimson/osd/osd_operations/peering_event.cc @@ -62,13 +62,13 @@ seastar::future<> PeeringEvent::start() return maybe_delay.then([this] { return get_pg(); }).then([this](Ref pg) { + if (!pg) { + logger().warn("{}: pg absent, did not create", *this); + on_pg_absent(); + handle.exit(); + return complete_rctx_no_pg(); + } return interruptor::with_interruption([this, pg] { - if (!pg) { - logger().warn("{}: pg absent, did not create", *this); - on_pg_absent(); - handle.exit(); - return complete_rctx(pg); - } logger().debug("{}: pg present", *this); return with_blocking_future_interruptible( handle.enter(pp(*pg).await_map) @@ -165,6 +165,15 @@ PeeringEvent::interruptible_future<> RemotePeeringEvent::complete_rctx(Ref p } } +seastar::future<> RemotePeeringEvent::complete_rctx_no_pg() +{ + logger().debug("{}: OSDState is {}", *this, osd.state); + return osd.state.when_active().then([this] { + assert(osd.state.is_active()); + return shard_services.dispatch_context_messages(std::move(ctx)); + }); +} + seastar::future> RemotePeeringEvent::get_pg() { return with_blocking_future( diff --git a/src/crimson/osd/osd_operations/peering_event.h b/src/crimson/osd/osd_operations/peering_event.h index 3e6b907e9ff..d9b9d2db53a 100644 --- a/src/crimson/osd/osd_operations/peering_event.h +++ b/src/crimson/osd/osd_operations/peering_event.h @@ -61,6 +61,7 @@ protected: virtual void on_pg_absent(); virtual PeeringEvent::interruptible_future<> complete_rctx(Ref); + virtual seastar::future<> complete_rctx_no_pg() { return seastar::now();} virtual seastar::future> get_pg() = 0; public: @@ -96,6 +97,7 @@ protected: void on_pg_absent() final; PeeringEvent::interruptible_future<> complete_rctx(Ref pg) override; + seastar::future<> complete_rctx_no_pg() override; seastar::future> get_pg() final; public: