From: chunmei-liu Date: Sun, 12 Dec 2021 06:16:36 +0000 (-0800) Subject: crimson/osd: fix interruptor assert when no pg in peering_event X-Git-Tag: v17.1.0~247^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F44290%2Fhead;p=ceph.git crimson/osd: fix interruptor assert when no pg in peering_event when no pg created, can't use interruptor Signed-off-by: chunmei-liu --- diff --git a/src/crimson/osd/osd_operations/peering_event.cc b/src/crimson/osd/osd_operations/peering_event.cc index 398fc945a099f..a43fb8d2c3ed5 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 3e6b907e9ffed..d9b9d2db53a1e 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: