From bf27f409f5e95a70758b93fb7c8b53ad2ae94ced Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Thu, 18 Nov 2021 14:59:48 -0800 Subject: [PATCH] crimson/osd: add delay for background_recovery to avoid interuptor nested. Signed-off-by: chunmei-liu --- .../osd/osd_operations/background_recovery.cc | 45 ++++++++++++------- .../osd/osd_operations/background_recovery.h | 6 ++- src/crimson/osd/pg_recovery.cc | 3 +- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/crimson/osd/osd_operations/background_recovery.cc b/src/crimson/osd/osd_operations/background_recovery.cc index a8ac12cfc495c..7fb0556d7adce 100644 --- a/src/crimson/osd/osd_operations/background_recovery.cc +++ b/src/crimson/osd/osd_operations/background_recovery.cc @@ -22,9 +22,11 @@ BackgroundRecovery::BackgroundRecovery( Ref 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(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(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 @@ -100,12 +109,14 @@ void UrgentRecovery::dump_detail(Formatter *f) const PglogBasedRecovery::PglogBasedRecovery( Ref 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 diff --git a/src/crimson/osd/osd_operations/background_recovery.h b/src/crimson/osd/osd_operations/background_recovery.h index d7fbc6127df0a..c24f60c440421 100644 --- a/src/crimson/osd/osd_operations/background_recovery.h +++ b/src/crimson/osd/osd_operations/background_recovery.h @@ -23,7 +23,7 @@ public: Ref 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; const epoch_t epoch_started; + float delay = 0; private: virtual void dump_detail(Formatter *f) const; @@ -77,7 +78,8 @@ public: PglogBasedRecovery( Ref pg, ShardServices &ss, - epoch_t epoch_started); + epoch_t epoch_started, + float delay = 0); private: interruptible_future do_recovery() override; diff --git a/src/crimson/osd/pg_recovery.cc b/src/crimson/osd/pg_recovery.cc index e076b1c817fd8..571c1893ed246 100644 --- a/src/crimson/osd/pg_recovery.cc +++ b/src/crimson/osd/pg_recovery.cc @@ -36,7 +36,8 @@ void PGRecovery::start_pglogbased_recovery() (void) pg->get_shard_services().start_operation( static_cast(pg), pg->get_shard_services(), - pg->get_osdmap_epoch()); + pg->get_osdmap_epoch(), + float(0.001)); } PGRecovery::blocking_interruptible_future -- 2.39.5