// Detect MDS_HEALTH_TRIM condition
// Indicates MDS is not trimming promptly
{
- const auto log_max_segments = mds->mdlog->get_max_segments();
- const auto log_warn_factor = g_conf().get_val<double>("mds_log_warn_factor");
- if (mds->mdlog->get_num_segments() > (size_t)(log_max_segments * log_warn_factor)) {
+ if (mds->mdlog->is_trim_slow()) {
+ auto num_segments = mds->mdlog->get_num_segments();
+ auto max_segments = mds->mdlog->get_max_segments();
CachedStackStringStream css;
- *css << "Behind on trimming (" << mds->mdlog->get_num_segments()
- << "/" << log_max_segments << ")";
+ *css << "Behind on trimming (" << num_segments << "/" << max_segments << ")";
MDSHealthMetric m(MDS_HEALTH_TRIM, HEALTH_WARN, css->strv());
- m.metadata["num_segments"] = stringify(mds->mdlog->get_num_segments());
- m.metadata["max_segments"] = stringify(log_max_segments);
+ m.metadata["num_segments"] = stringify(num_segments);
+ m.metadata["max_segments"] = stringify(max_segments);
health.metrics.push_back(m);
}
}
max_events = g_conf().get_val<int64_t>("mds_log_max_events");
skip_corrupt_events = g_conf().get_val<bool>("mds_log_skip_corrupt_events");
skip_unbounded_events = g_conf().get_val<bool>("mds_log_skip_unbounded_events");
+ log_warn_factor = g_conf().get_val<double>("mds_log_warn_factor");
upkeep_thread = std::thread(&MDLog::log_trim_upkeep, this);
}
}
}
+bool MDLog::is_trim_slow() const {
+ return (segments.size() > (size_t)(max_segments * log_warn_factor));
+}
+
void MDLog::log_trim_upkeep(void) {
dout(10) << dendl;
if (changed.count("mds_log_trim_decay_rate")){
log_trim_counter = DecayCounter(g_conf().get_val<double>("mds_log_trim_decay_rate"));
}
+ if (changed.count("mds_log_warn_factor")) {
+ log_warn_factor = g_conf().get_val<double>("mds_log_warn_factor");
+ }
}
// replay state
std::map<inodeno_t, std::set<inodeno_t>> pending_exports;
+ // beacon needs me too
+ bool is_trim_slow() const;
+
protected:
struct PendingEvent {
PendingEvent(LogEvent *e, Context* c, bool f=false) : le(e), fin(c), flush(f) {}
std::set<LogSegment*> expired_segments;
std::set<LogSegment*> expiring_segments;
uint64_t events_since_last_major_segment = 0;
+ double log_warn_factor;
// log trimming decay counter
DecayCounter log_trim_counter;