#include "mon/Monitor.h"
#include "mon/HealthMonitor.h"
+#include "mon/OSDMonitor.h"
#include "messages/MMonHealthChecks.h"
if (g_conf().get_val<bool>("mon_warn_on_msgr2_not_enabled")) {
check_if_msgr2_enabled(&next);
}
+ // STRETCH MODE
+ check_mon_crush_loc_stretch_mode(&next);
if (next != leader_checks) {
changed = true;
}
}
}
+
+void HealthMonitor::check_mon_crush_loc_stretch_mode(health_check_map_t *checks)
+{
+ // Check if the CRUSH location exists for all MONs
+ if (!mon.monmap->stretch_mode_enabled){
+ return;
+ }
+ list<string> details;
+ for (auto& i : mon.monmap->mon_info) {
+ // Skip the tiebreaker monitor
+ if (i.second.name == mon.monmap->tiebreaker_mon) {
+ continue;
+ }
+ for (auto& pair : i.second.crush_loc){
+ if (!mon.osdmon()->osdmap.crush->name_exists(pair.second)) {
+ ostringstream ds;
+ ds << "CRUSH location " << pair.second << " does not exist";
+ details.push_back(ds.str());
+ }
+ }
+ }
+ // WARN in ceph -s if the CRUSH location does not exist
+ if (!details.empty()) {
+ ostringstream ss;
+ ss << details.size() << " monitor(s) have nonexistent CRUSH location";
+ auto &d = checks->add("NONEXISTENT_MON_CRUSH_LOC_STRETCH_MODE", HEALTH_WARN, ss.str(),
+ details.size());
+ d.detail.swap(details);
+ }
+}
void check_for_older_version(health_check_map_t *checks);
void check_for_mon_down(health_check_map_t *checks);
void check_for_clock_skew(health_check_map_t *checks);
+ void check_mon_crush_loc_stretch_mode(health_check_map_t *checks);
void check_if_msgr2_enabled(health_check_map_t *checks);
bool check_leader_health();
bool check_member_health();