void OSDMonitor::update_msgr_features()
{
- uint64_t mask;
- uint64_t features = osdmap.get_features(&mask);
-
set<int> types;
types.insert((int)entity_name_t::TYPE_OSD);
types.insert((int)entity_name_t::TYPE_CLIENT);
types.insert((int)entity_name_t::TYPE_MDS);
types.insert((int)entity_name_t::TYPE_MON);
for (set<int>::iterator q = types.begin(); q != types.end(); ++q) {
+ uint64_t mask;
+ uint64_t features = osdmap.get_features(*q, &mask);
if ((mon->messenger->get_policy(*q).features_required & mask) != features) {
dout(0) << "crush map has features " << features << ", adjusting msgr requires" << dendl;
Messenger::Policy p = mon->messenger->get_policy(*q);
assert(m->get_orig_source_inst().name.is_osd());
// check if osd has required features to boot
- if ((osdmap.get_features(NULL) & CEPH_FEATURE_OSD_ERASURE_CODES) &&
+ if ((osdmap.get_features(CEPH_ENTITY_TYPE_OSD, NULL) &
+ CEPH_FEATURE_OSD_ERASURE_CODES) &&
!(m->get_connection()->get_features() & CEPH_FEATURE_OSD_ERASURE_CODES)) {
dout(0) << __func__ << " osdmap requires Erasure Codes but osd at "
<< m->get_orig_source_inst()
// current memory location, and setting or clearing bits in integer
// fields, and we are the only writer, this is not a problem.
- uint64_t mask;
- uint64_t features = osdmap->get_features(&mask);
-
{
Messenger::Policy p = client_messenger->get_default_policy();
+ uint64_t mask;
+ uint64_t features = osdmap->get_features(entity_name_t::TYPE_CLIENT, &mask);
if ((p.features_required & mask) != features) {
dout(0) << "crush map has features " << features
<< ", adjusting msgr requires for clients" << dendl;
client_messenger->set_default_policy(p);
}
}
+ {
+ Messenger::Policy p = cluster_messenger->get_policy(entity_name_t::TYPE_MON);
+ uint64_t mask;
+ uint64_t features = osdmap->get_features(entity_name_t::TYPE_MON, &mask);
+ if ((p.features_required & mask) != features) {
+ dout(0) << "crush map has features " << features
+ << ", adjusting msgr requires for mons" << dendl;
+ p.features_required = (p.features_required & ~mask) | features;
+ client_messenger->set_policy(entity_name_t::TYPE_MON, p);
+ }
+ }
{
Messenger::Policy p = cluster_messenger->get_policy(entity_name_t::TYPE_OSD);
+ uint64_t mask;
+ uint64_t features = osdmap->get_features(entity_name_t::TYPE_OSD, &mask);
+
if ((p.features_required & mask) != features) {
dout(0) << "crush map has features " << features
<< ", adjusting msgr requires for osds" << dendl;
p.features_required = (p.features_required & ~mask) | features;
cluster_messenger->set_policy(entity_name_t::TYPE_OSD, p);
}
- }
- if ((features & CEPH_FEATURE_OSD_ERASURE_CODES) &&
+ if ((features & CEPH_FEATURE_OSD_ERASURE_CODES) &&
!fs->get_allow_sharded_objects()) {
- dout(0) << __func__ << " enabling on-disk ERASURE CODES compat feature" << dendl;
- superblock.compat_features.incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_SHARDS);
- ObjectStore::Transaction *t = new ObjectStore::Transaction;
- write_superblock(*t);
- int err = store->queue_transaction_and_cleanup(NULL, t);
- assert(err == 0);
- fs->set_allow_sharded_objects();
+ dout(0) << __func__ << " enabling on-disk ERASURE CODES compat feature" << dendl;
+ superblock.compat_features.incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_SHARDS);
+ ObjectStore::Transaction *t = new ObjectStore::Transaction;
+ write_superblock(*t);
+ int err = store->queue_transaction_and_cleanup(NULL, t);
+ assert(err == 0);
+ fs->set_allow_sharded_objects();
+ }
}
}
}
-uint64_t OSDMap::get_features(uint64_t *pmask) const
+uint64_t OSDMap::get_features(int entity_type, uint64_t *pmask) const
{
uint64_t features = 0; // things we actually have
uint64_t mask = 0; // things we could have
features |= CEPH_FEATURE_OSD_CACHEPOOL;
}
}
- mask |= CEPH_FEATURE_OSDHASHPSPOOL | CEPH_FEATURE_OSD_CACHEPOOL |
- CEPH_FEATURE_OSD_ERASURE_CODES;
+ mask |= CEPH_FEATURE_OSDHASHPSPOOL | CEPH_FEATURE_OSD_CACHEPOOL;
+ if (entity_type != CEPH_ENTITY_TYPE_CLIENT)
+ mask |= CEPH_FEATURE_OSD_ERASURE_CODES;
if (osd_primary_affinity) {
for (int i = 0; i < max_osd; ++i) {
/**
* get feature bits required by the current structure
*
+ * @param entity_type [in] what entity type we are asking about
* @param mask [out] set of all possible map-related features we could set
* @return feature bits used by this map
*/
- uint64_t get_features(uint64_t *mask) const;
+ uint64_t get_features(int entity_type, uint64_t *mask) const;
/**
* get intersection of features supported by up osds
if (found_missing && num_unfound_before != missing_loc.num_unfound())
publish_stats_to_osd();
if (found_missing &&
- (get_osdmap()->get_features(NULL) & CEPH_FEATURE_OSD_ERASURE_CODES)) {
+ (get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, NULL) &
+ CEPH_FEATURE_OSD_ERASURE_CODES)) {
pg_info_t tinfo(oinfo);
tinfo.pgid.shard = pg_whoami.shard;
(*(ctx->info_map))[from.osd].push_back(