pg_cond.allow_deep =
!(get_osdmap()->test_flag(CEPH_OSDMAP_NODEEP_SCRUB) ||
pool.info.has_flag(pg_pool_t::FLAG_NODEEP_SCRUB));
- pg_cond.has_deep_errors = (info.stats.stats.sum.num_deep_scrub_errors > 0);
pg_cond.can_autorepair =
(cct->_conf->osd_scrub_auto_repair &&
get_pgbackend()->auto_repair_supported());
}
}
- // restricting shallow scrubs of PGs that have deep errors:
- if (pg_cond.has_deep_errors && trgt.is_shallow()) {
- if (trgt.urgency() < urgency_t::operator_requested) {
- // if there are deep errors, we should have scheduled a deep scrub first.
- // If we are here trying to perform a shallow scrub, it means that for some
- // reason that deep scrub failed to be initiated. We will not try a shallow
- // scrub until this is solved.
- dout(10) << __func__ << ": Regular scrub skipped due to deep-scrub errors"
- << dendl;
- requeue_penalized(
- s_or_d, delay_both_targets_t::no, delay_cause_t::pg_state, clock_now);
- return schedule_result_t::target_specific_failure;
- } else {
- // we will honor the request anyway, but will report the issue
- m_osds->clog->error() << fmt::format(
- "osd.{} pg {} Regular scrub request, deep-scrub details will be lost",
- m_osds->whoami, m_pg_id);
- }
- }
-
// if only explicitly requested repairing is allowed - skip other types
// of scrubbing
if (osd_restrictions.allow_requested_repair_only &&
struct ScrubPGPreconds {
bool allow_shallow{true};
bool allow_deep{true};
- bool has_deep_errors{false};
bool can_autorepair{false};
};
static_assert(sizeof(Scrub::ScrubPGPreconds) <= sizeof(uint32_t));
auto format(const Scrub::ScrubPGPreconds& conds, FormatContext& ctx) const
{
return fmt::format_to(
- ctx.out(), "allowed(shallow/deep):{:1}/{:1},deep-err:{:1},can-autorepair:{:1}",
- conds.allow_shallow, conds.allow_deep, conds.has_deep_errors,
- conds.can_autorepair);
+ ctx.out(), "allowed(shallow/deep):{:1}/{:1},can-autorepair:{:1}",
+ conds.allow_shallow, conds.allow_deep, conds.can_autorepair);
}
};