return 0;
}
+bool OSDMonitor::validate_crush_against_features(const CrushWrapper *newcrush,
+ stringstream& ss)
+{
+ OSDMap::Incremental new_pending = pending_inc;
+ ::encode(*newcrush, new_pending.crush);
+ OSDMap newmap;
+ newmap.deepish_copy_from(osdmap);
+ newmap.apply_incremental(new_pending);
+ uint64_t features = newmap.get_features(CEPH_ENTITY_TYPE_MON, NULL);
+
+ stringstream features_ss;
+
+ int r = check_cluster_features(features, features_ss);
+
+ if (!r)
+ return true;
+
+ ss << "Could not change CRUSH: " << features_ss.str();
+ return false;
+}
+
bool OSDMonitor::erasure_code_profile_in_use(const map<int64_t, pg_pool_t> &pools,
const string &profile,
ostream &ss)
goto reply;
}
+ if (!validate_crush_against_features(&crush, ss)) {
+ err = -EINVAL;
+ goto reply;
+ }
+
// sanity check: test some inputs to make sure this map isn't totally broken
dout(10) << " testing map" << dendl;
stringstream ess;
err = -EINVAL;
goto reply;
}
+
+ if (!validate_crush_against_features(&newcrush, ss)) {
+ err = -EINVAL;
+ goto reply;
+ }
+
pending_inc.crush.clear();
newcrush.encode(pending_inc.crush);
ss << "adjusted tunables profile to " << profile;
void update_msgr_features();
int check_cluster_features(uint64_t features, stringstream &ss);
+ /**
+ * check if the cluster supports the features required by the
+ * given crush map. Outputs the daemons which don't support it
+ * to the stringstream.
+ *
+ * @returns true if the map is passable, false otherwise
+ */
+ bool validate_crush_against_features(const CrushWrapper *newcrush,
+ stringstream &ss);
void share_map_with_random_osd();