One or more PGs has not been scrubbed recently. PGs are normally
scrubbed every ``mon_scrub_interval`` seconds, and this warning
-triggers when ``mon_warn_not_scrubbed`` such intervals have elapsed
-without a scrub.
+triggers when ``mon_warn_pg_not_scrubbed_ratio`` percentage of interval has elapsed
+without a scrub since it was due.
PGs will not scrub if they are not flagged as *clean*, which may
happen if they are misplaced or degraded (see *PG_AVAILABILITY* and
One or more PGs has not been deep scrubbed recently. PGs are normally
scrubbed every ``osd_deep_mon_scrub_interval`` seconds, and this warning
-triggers when ``mon_warn_not_deep_scrubbed`` such intervals have elapsed
-without a scrub.
+triggers when ``mon_warn_pg_not_deep_scrubbed_ratio`` percentage of interval has elapsed
+without a scrub since it was due.
PGs will not (deep) scrub if they are not flagged as *clean*, which may
happen if they are misplaced or degraded (see *PG_AVAILABILITY* and
.add_service("mon")
.set_description("issue MON_DISK_BIG health warning when mon database is above this size"),
- Option("mon_warn_not_scrubbed", Option::TYPE_INT, Option::LEVEL_ADVANCED)
- .set_default(0)
- .add_service("mon")
- .set_description("if non-zero, issue PG_NOT_SCRUBBED when PG(s) have not been scrubbed for more than this long beyond the configured mon_scrub_interval (seconds)")
- .add_see_also("osd_scrub_min_interval"),
+ Option("mon_warn_pg_not_scrubbed_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(0.5)
+ .set_min(0)
+ .set_description("Percentage of the scrub max interval past the scrub max interval to warn")
+ .set_long_description("")
+ .add_see_also("osd_scrub_max_interval"),
- Option("mon_warn_not_deep_scrubbed", Option::TYPE_INT, Option::LEVEL_ADVANCED)
- .set_default(0)
- .add_service("mon")
- .set_description("if non-zero, issue PG_NOT_DEEP_SCRUBBED when PG(s) have not been scrubbed for more than this long beyond the configured mon_scrub_interval (seconds)")
+ Option("mon_warn_pg_not_deep_scrubbed_ratio", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(0.75)
+ .set_min(0)
+ .set_description("Percentage of the deep scrub interval past the deep scrub interval to warn")
+ .set_long_description("")
.add_see_also("osd_deep_scrub_interval"),
Option("mon_scrub_interval", Option::TYPE_INT, Option::LEVEL_ADVANCED)
// PG_NOT_SCRUBBED
// PG_NOT_DEEP_SCRUBBED
- {
- if (cct->_conf->mon_warn_not_scrubbed ||
- cct->_conf->mon_warn_not_deep_scrubbed) {
- list<string> detail, deep_detail;
- int detail_max = max, deep_detail_max = max;
- int detail_more = 0, deep_detail_more = 0;
- int detail_total = 0, deep_detail_total = 0;
- const double age = cct->_conf->mon_warn_not_scrubbed +
- cct->_conf->mon_scrub_interval;
- utime_t cutoff = now;
- cutoff -= age;
- const double deep_age = cct->_conf->mon_warn_not_deep_scrubbed +
- cct->_conf->osd_deep_scrub_interval;
- utime_t deep_cutoff = now;
- deep_cutoff -= deep_age;
- for (auto& p : pg_stat) {
- if (cct->_conf->mon_warn_not_scrubbed &&
- p.second.last_scrub_stamp < cutoff) {
+ if (cct->_conf->mon_warn_pg_not_scrubbed_ratio ||
+ cct->_conf->mon_warn_pg_not_deep_scrubbed_ratio) {
+ list<string> detail, deep_detail;
+ int detail_max = max, deep_detail_max = max;
+ int detail_more = 0, deep_detail_more = 0;
+ int detail_total = 0, deep_detail_total = 0;
+ for (auto& p : pg_stat) {
+ int64_t pnum = p.first.pool();
+ auto pool = osdmap.get_pg_pool(pnum);
+ if (!pool)
+ continue;
+ if (cct->_conf->mon_warn_pg_not_scrubbed_ratio) {
+ double scrub_max_interval = 0;
+ pool->opts.get(pool_opts_t::SCRUB_MAX_INTERVAL, &scrub_max_interval);
+ if (scrub_max_interval <= 0) {
+ scrub_max_interval = cct->_conf->osd_scrub_max_interval;
+ }
+ const double age = (cct->_conf->mon_warn_pg_not_scrubbed_ratio * scrub_max_interval) +
+ scrub_max_interval;
+ utime_t cutoff = now;
+ cutoff -= age;
+ if (p.second.last_scrub_stamp < cutoff) {
if (detail_max > 0) {
ostringstream ss;
ss << "pg " << p.first << " not scrubbed since "
}
++detail_total;
}
- if (cct->_conf->mon_warn_not_deep_scrubbed &&
- p.second.last_deep_scrub_stamp < deep_cutoff) {
+ }
+ if (cct->_conf->mon_warn_pg_not_deep_scrubbed_ratio) {
+ double deep_scrub_interval = 0;
+ pool->opts.get(pool_opts_t::DEEP_SCRUB_INTERVAL, &deep_scrub_interval);
+ if (deep_scrub_interval <= 0) {
+ deep_scrub_interval = cct->_conf->osd_deep_scrub_interval;
+ }
+ double deep_age = (cct->_conf->mon_warn_pg_not_deep_scrubbed_ratio * deep_scrub_interval) +
+ deep_scrub_interval;
+ utime_t deep_cutoff = now;
+ deep_cutoff -= deep_age;
+ if (p.second.last_deep_scrub_stamp < deep_cutoff) {
if (deep_detail_max > 0) {
ostringstream ss;
ss << "pg " << p.first << " not deep-scrubbed since "
++deep_detail_more;
}
++deep_detail_total;
- }
+ }
}
- if (detail_total) {
- ostringstream ss;
- ss << detail_total << " pgs not scrubbed for " << age;
- auto& d = checks->add("PG_NOT_SCRUBBED", HEALTH_WARN, ss.str());
+ }
+ if (detail_total) {
+ ostringstream ss;
+ ss << detail_total << " pgs not scrubbed in time";
+ auto& d = checks->add("PG_NOT_SCRUBBED", HEALTH_WARN, ss.str());
- if (!detail.empty()) {
- d.detail.swap(detail);
+ if (!detail.empty()) {
+ d.detail.swap(detail);
- if (detail_more) {
- ostringstream ss;
- ss << detail_more << " more pgs... ";
- d.detail.push_back(ss.str());
- }
+ if (detail_more) {
+ ostringstream ss;
+ ss << detail_more << " more pgs... ";
+ d.detail.push_back(ss.str());
}
}
- if (deep_detail_total) {
- ostringstream ss;
- ss << deep_detail_total << " pgs not deep-scrubbed for " << deep_age;
- auto& d = checks->add("PG_NOT_DEEP_SCRUBBED", HEALTH_WARN, ss.str());
+ }
+ if (deep_detail_total) {
+ ostringstream ss;
+ ss << deep_detail_total << " pgs not deep-scrubbed in time";
+ auto& d = checks->add("PG_NOT_DEEP_SCRUBBED", HEALTH_WARN, ss.str());
- if (!deep_detail.empty()) {
- d.detail.swap(deep_detail);
+ if (!deep_detail.empty()) {
+ d.detail.swap(deep_detail);
- if (deep_detail_more) {
- ostringstream ss;
- ss << deep_detail_more << " more pgs... ";
- d.detail.push_back(ss.str());
- }
+ if (deep_detail_more) {
+ ostringstream ss;
+ ss << deep_detail_more << " more pgs... ";
+ d.detail.push_back(ss.str());
}
}
}