]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon, osd: adjust msgr requires for CRUSH_TUNABLES2 feature
authorSage Weil <sage@inktank.com>
Mon, 26 Nov 2012 00:52:25 +0000 (16:52 -0800)
committerSage Weil <sage@inktank.com>
Tue, 27 Nov 2012 01:15:45 +0000 (17:15 -0800)
Make this code a bit manageable for multiple features.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/OSDMonitor.cc
src/osd/OSD.cc

index 5ec003e4fba8db93e5822e1404cc8f3f0ba06a53..e72929b7d43c2c6d4b86ec6f42040310cd79fecd 100644 (file)
@@ -165,23 +165,19 @@ void OSDMonitor::update_msgr_features()
   types.insert((int)entity_name_t::TYPE_MDS);
   types.insert((int)entity_name_t::TYPE_MON);
 
-  if (osdmap.crush->has_nondefault_tunables()) {
-    for (set<int>::iterator q = types.begin(); q != types.end(); ++q) {
-      if (!(mon->messenger->get_policy(*q).features_required & CEPH_FEATURE_CRUSH_TUNABLES)) {
-       dout(0) << "crush map has non-default tunables, requiring CRUSH_TUNABLES feature" << dendl;
-       Messenger::Policy p = mon->messenger->get_policy(*q);
-       p.features_required |= CEPH_FEATURE_CRUSH_TUNABLES;
-       mon->messenger->set_policy(*q, p);
-      }
-    }
-  } else {
-    for (set<int>::iterator q = types.begin(); q != types.end(); ++q) {
-      if (mon->messenger->get_policy(*q).features_required & CEPH_FEATURE_CRUSH_TUNABLES) {
-       dout(0) << "crush map has default tunables, not requiring CRUSH_TUNABLES feature" << dendl;
-       Messenger::Policy p = mon->messenger->get_policy(*q);
-       p.features_required &= ~CEPH_FEATURE_CRUSH_TUNABLES;
-       mon->messenger->set_policy(*q, p);
-      }
+  uint64_t mask = CEPH_FEATURES_CRUSH;
+  uint64_t features = 0;
+  if (osdmap.crush->has_nondefault_tunables())
+    features |= CEPH_FEATURE_CRUSH_TUNABLES;
+  if (osdmap.crush->has_nondefault_tunables2())
+    features |= CEPH_FEATURE_CRUSH_TUNABLES2;
+
+  for (set<int>::iterator q = types.begin(); q != types.end(); ++q) {
+    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);
+      p.features_required = (p.features_required & ~mask) | features;
+      mon->messenger->set_policy(*q, p);
     }
   }
 }
index 3dfae663ba2c73b9d4757ba144a874763491e585..bdff3016ecead0c4851108e884310b1302bebc27 100644 (file)
@@ -3763,31 +3763,28 @@ void OSD::check_osdmap_features()
   // current memory location, and setting or clearing bits in integer
   // fields, and we are the only writer, this is not a problem.
 
-  Messenger::Policy p = client_messenger->get_default_policy();
-  if (osdmap->crush->has_nondefault_tunables()) {
-    if (!(p.features_required & CEPH_FEATURE_CRUSH_TUNABLES)) {
-      dout(0) << "crush map has non-default tunables, requiring CRUSH_TUNABLES feature for clients" << dendl;
-      p.features_required |= CEPH_FEATURE_CRUSH_TUNABLES;
-      client_messenger->set_default_policy(p);
-    }
-    if (!(cluster_messenger->get_policy(entity_name_t::TYPE_OSD).features_required &
-         CEPH_FEATURE_CRUSH_TUNABLES)) {
-      dout(0) << "crush map has non-default tunables, requiring CRUSH_TUNABLES feature for osds" << dendl;
-      Messenger::Policy p = cluster_messenger->get_policy(entity_name_t::TYPE_OSD);
-      p.features_required |= CEPH_FEATURE_CRUSH_TUNABLES;
-      cluster_messenger->set_policy(entity_name_t::TYPE_OSD, p);
-    }
-  } else {
-    if (p.features_required & CEPH_FEATURE_CRUSH_TUNABLES) {
-      dout(0) << "crush map has default tunables, not requiring CRUSH_TUNABLES feature for clients" << dendl;
-      p.features_required &= ~CEPH_FEATURE_CRUSH_TUNABLES;
+  uint64_t mask = CEPH_FEATURES_CRUSH;
+  uint64_t features = 0;
+  if (osdmap->crush->has_nondefault_tunables())
+    features |= CEPH_FEATURE_CRUSH_TUNABLES;
+  if (osdmap->crush->has_nondefault_tunables2())
+    features |= CEPH_FEATURE_CRUSH_TUNABLES2;
+
+  {
+    Messenger::Policy p = client_messenger->get_default_policy();
+    if ((p.features_required & mask) != features) {
+      dout(0) << "crush map has features " << features
+             << ", adjusting msgr requires for clients" << dendl;
+      p.features_required = (p.features_required & ~mask) | features;
       client_messenger->set_default_policy(p);
     }
-    if (cluster_messenger->get_policy(entity_name_t::TYPE_OSD).features_required &
-       CEPH_FEATURE_CRUSH_TUNABLES) {
-      dout(0) << "crush map has default tunables, not requiring CRUSH_TUNABLES feature for osds" << dendl;
-      Messenger::Policy p = cluster_messenger->get_policy(entity_name_t::TYPE_OSD);
-      p.features_required &= ~CEPH_FEATURE_CRUSH_TUNABLES;
+  }
+  {
+    Messenger::Policy p = cluster_messenger->get_policy(entity_name_t::TYPE_OSD);
+    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);
     }
   }