]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: fix interruptor assert when no pg in peering_event
authorchunmei-liu <chunmei.liu@intel.com>
Sun, 12 Dec 2021 06:16:36 +0000 (22:16 -0800)
committerchunmei-liu <chunmei.liu@intel.com>
Mon, 13 Dec 2021 05:09:09 +0000 (21:09 -0800)
when no pg created, can't use interruptor

Signed-off-by: chunmei-liu <chunmei.liu@intel.com>
src/crimson/osd/osd_operations/peering_event.cc
src/crimson/osd/osd_operations/peering_event.h

index 398fc945a099f9bb0ab4659a68aee084c303bcd1..a43fb8d2c3ed5550fd440c66d85af6f3dabf51e2 100644 (file)
@@ -62,13 +62,13 @@ seastar::future<> PeeringEvent::start()
   return maybe_delay.then([this] {
     return get_pg();
   }).then([this](Ref<PG> 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<interruptor::condition>(
         handle.enter(pp(*pg).await_map)
@@ -165,6 +165,15 @@ PeeringEvent::interruptible_future<> RemotePeeringEvent::complete_rctx(Ref<PG> 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<Ref<PG>> RemotePeeringEvent::get_pg()
 {
   return with_blocking_future(
index 3e6b907e9ffedf9eeaf6e3899b4025cf7d4785cb..d9b9d2db53a1e818a37b98a72dc0faff74eebd8a 100644 (file)
@@ -61,6 +61,7 @@ protected:
 
   virtual void on_pg_absent();
   virtual PeeringEvent::interruptible_future<> complete_rctx(Ref<PG>);
+  virtual seastar::future<> complete_rctx_no_pg() { return seastar::now();}
   virtual seastar::future<Ref<PG>> get_pg() = 0;
 
 public:
@@ -96,6 +97,7 @@ protected:
 
   void on_pg_absent() final;
   PeeringEvent::interruptible_future<> complete_rctx(Ref<PG> pg) override;
+  seastar::future<> complete_rctx_no_pg() override;
   seastar::future<Ref<PG>> get_pg() final;
 
 public: