Ref<PG> pg,
ShardServices &ss,
epoch_t epoch_started,
- crimson::osd::scheduler::scheduler_class_t scheduler_class,
+ SchedulerClass scheduler_class,
float delay)
: pg(pg),
epoch_started(epoch_started),
ShardServices& ss,
epoch_t epoch_started)
: BackgroundRecoveryT{pg, ss, epoch_started,
- crimson::osd::scheduler::scheduler_class_t::immediate},
+ SchedulerClass::immediate},
soid{soid}, need(need)
{
}
std::move(pg),
ss,
epoch_started,
- crimson::osd::scheduler::scheduler_class_t::background_recovery,
+ SchedulerClass::background_recovery,
delay)
{}
Ref<PG> pg,
ShardServices &ss,
epoch_t epoch_started,
- crimson::osd::scheduler::scheduler_class_t scheduler_class, float delay = 0);
+ SchedulerClass scheduler_class, float delay = 0);
virtual void print(std::ostream &) const;
seastar::future<> start();
private:
virtual void dump_detail(Formatter *f) const;
crimson::osd::scheduler::params_t get_scheduler_params() const {
+ int cost = static_cast<int>(std::max<int64_t>(1, pg->get_average_object_size()));
+ unsigned priority = pg->get_recovery_op_priority();
+
return {
- 1, // cost
+ cost, // cost
+ priority, // priority
0, // owner
scheduler_class
};
using do_recovery_ret_t = typename PhasedOperationT<T>::template interruptible_future<seastar::stop_iteration>;
virtual do_recovery_ret_t do_recovery() = 0;
ShardServices &ss;
- const crimson::osd::scheduler::scheduler_class_t scheduler_class;
+ const SchedulerClass scheduler_class;
};
/// represent a recovery initiated for serving a client request
int *return_code,
std::vector<pg_log_op_return_item_t> *op_returns) const;
int get_recovery_op_priority() const {
- int64_t pri = 0;
- get_pgpool().info.opts.get(pool_opts_t::RECOVERY_OP_PRIORITY, &pri);
- return pri > 0 ? pri : crimson::common::local_conf()->osd_recovery_op_priority;
+ return peering_state.get_recovery_op_priority();
+ }
+ int64_t get_average_object_size() {
+ const auto& stats = get_info().stats.stats.sum;
+ auto num_objects = stats.num_objects;
+ auto num_bytes = stats.num_bytes;
+
+ if (num_objects <= 0)
+ return 0;
+
+ return num_bytes / num_objects;
}
seastar::future<> mark_unfound_lost(int) {
// TODO: see PrimaryLogPG::mark_all_unfound_lost()
auto releaser = co_await interruptor::make_interruptible(
pg->get_shard_services().get_throttle(
crimson::osd::scheduler::params_t{
- 1, 0, crimson::osd::scheduler::scheduler_class_t::background_best_effort
+ 1, 0, 0, SchedulerClass::background_best_effort
}));
DEBUGDPP("got throttle: {} {}", pg->get_dpp(), soid, need);
co_await pg->get_recovery_backend()->recover_object(soid, need);