]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add delay for background_recovery 44019/head
authorchunmei-liu <chunmei.liu@intel.com>
Thu, 18 Nov 2021 22:59:48 +0000 (14:59 -0800)
committerchunmei-liu <chunmei.liu@intel.com>
Thu, 18 Nov 2021 23:47:24 +0000 (15:47 -0800)
to avoid interuptor nested.

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

index a8ac12cfc495c8da4e1e82ce4025976315301e94..7fb0556d7adce948df4439af48c4c9d44f79363d 100644 (file)
@@ -22,9 +22,11 @@ BackgroundRecovery::BackgroundRecovery(
   Ref<PG> pg,
   ShardServices &ss,
   epoch_t epoch_started,
-  crimson::osd::scheduler::scheduler_class_t scheduler_class)
+  crimson::osd::scheduler::scheduler_class_t scheduler_class,
+  float delay)
   : pg(pg),
     epoch_started(epoch_started),
+    delay(delay),
     ss(ss),
     scheduler_class(scheduler_class)
 {}
@@ -49,20 +51,27 @@ seastar::future<> BackgroundRecovery::start()
   logger().debug("{}: start", *this);
 
   IRef ref = this;
-  return ss.throttler.with_throttle_while(
-    this, get_scheduler_params(), [this] {
-      return interruptor::with_interruption([this] {
-       return do_recovery();
-      }, [](std::exception_ptr) {
-       return seastar::make_ready_future<bool>(false);
-      }, pg);
-    }).handle_exception_type([ref, this](const std::system_error& err) {
-      if (err.code() == std::make_error_code(std::errc::interrupted)) {
-       logger().debug("{} recovery interruped: {}", *pg, err.what());
-       return seastar::now();
-      }
-      return seastar::make_exception_future<>(err);
-    });
+  auto maybe_delay = seastar::now();
+  if (delay) {
+    maybe_delay = seastar::sleep(
+      std::chrono::milliseconds(std::lround(delay * 1000)));
+  }
+  return maybe_delay.then([ref, this] {
+    return ss.throttler.with_throttle_while(
+      this, get_scheduler_params(), [this] {
+        return interruptor::with_interruption([this] {
+          return do_recovery();
+        }, [](std::exception_ptr) {
+         return seastar::make_ready_future<bool>(false);
+        }, pg);
+      }).handle_exception_type([ref, this](const std::system_error& err) {
+        if (err.code() == std::make_error_code(std::errc::interrupted)) {
+          logger().debug("{} recovery interruped: {}", *pg, err.what());
+         return seastar::now();
+        }
+        return seastar::make_exception_future<>(err);
+      });
+  });
 }
 
 UrgentRecovery::interruptible_future<bool>
@@ -100,12 +109,14 @@ void UrgentRecovery::dump_detail(Formatter *f) const
 PglogBasedRecovery::PglogBasedRecovery(
   Ref<PG> pg,
   ShardServices &ss,
-  const epoch_t epoch_started)
+  const epoch_t epoch_started,
+  float delay)
   : BackgroundRecovery(
       std::move(pg),
       ss,
       epoch_started,
-      crimson::osd::scheduler::scheduler_class_t::background_recovery)
+      crimson::osd::scheduler::scheduler_class_t::background_recovery,
+      delay)
 {}
 
 PglogBasedRecovery::interruptible_future<bool>
index d7fbc6127df0a184a57a9b397f387468d7e5584c..c24f60c440421f3b3dc17fb64552fa26c8d78369 100644 (file)
@@ -23,7 +23,7 @@ public:
     Ref<PG> pg,
     ShardServices &ss,
     epoch_t epoch_started,
-    crimson::osd::scheduler::scheduler_class_t scheduler_class);
+    crimson::osd::scheduler::scheduler_class_t scheduler_class, float delay = 0);
 
   virtual void print(std::ostream &) const;
   seastar::future<> start();
@@ -31,6 +31,7 @@ public:
 protected:
   Ref<PG> pg;
   const epoch_t epoch_started;
+  float delay = 0;
 
 private:
   virtual void dump_detail(Formatter *f) const;
@@ -77,7 +78,8 @@ public:
   PglogBasedRecovery(
     Ref<PG> pg,
     ShardServices &ss,
-    epoch_t epoch_started);
+    epoch_t epoch_started,
+    float delay = 0);
 
 private:
   interruptible_future<bool> do_recovery() override;
index e076b1c817fd8d0e9e38c55a9ef732f0ecf530a8..571c1893ed246b20c436390c5d0722d5db139b4e 100644 (file)
@@ -36,7 +36,8 @@ void PGRecovery::start_pglogbased_recovery()
   (void) pg->get_shard_services().start_operation<PglogBasedRecovery>(
     static_cast<crimson::osd::PG*>(pg),
     pg->get_shard_services(),
-    pg->get_osdmap_epoch());
+    pg->get_osdmap_epoch(),
+    float(0.001));
 }
 
 PGRecovery::blocking_interruptible_future<bool>