]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: add get_crush_node_flags(int osd)
authorSage Weil <sage@redhat.com>
Fri, 12 Apr 2019 16:49:13 +0000 (11:49 -0500)
committerSage Weil <sage@redhat.com>
Fri, 12 Apr 2019 16:49:13 +0000 (11:49 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/test/osd/TestOSDMap.cc

index e5b4b94874e6f5989e87acaad35cc2c4e19886f5..efb2b9b6d592cfd159264819e7b04dbe2606824b 100644 (file)
@@ -5843,3 +5843,20 @@ float OSDMap::pool_raw_used_rate(int64_t poolid) const
     ceph_abort_msg("unrecognized pool type");
   }
 }
+
+unsigned OSDMap::get_crush_node_flags(int osd) const
+{
+  unsigned flags = 0;
+  if (!crush_node_flags.empty()) {
+    // the map will contain type -> name
+    std::map<std::string,std::string> ploc = crush->get_full_location(osd);
+    for (auto& i : ploc) {
+      int id = crush->get_item_id(i.second);
+      auto p = crush_node_flags.find(id);
+      if (p != crush_node_flags.end()) {
+       flags |= p->second;
+      }
+    }
+  }
+  return flags;
+}
index e2c9d5a70c5f0b82c3c12b7a6ce63c1c6f52d64c..46081422e9badf183a4e8bb21063c7d90e942383 100644 (file)
@@ -827,6 +827,8 @@ public:
     return !is_out(osd);
   }
 
+  unsigned get_crush_node_flags(int osd) const;
+
   bool is_noup(int osd) const {
     return exists(osd) && (osd_state[osd] & CEPH_OSD_NOUP);
   }
index b51f73ecbe972f80e833f20150faef7dfc42dfa0..0967a536a24c64606b9965f4cc8db78d09538034 100644 (file)
@@ -509,6 +509,37 @@ TEST_F(OSDMapTest, PrimaryAffinity) {
   }
 }
 
+TEST_F(OSDMapTest, get_crush_node_flags) {
+  set_up_map();
+
+  for (unsigned i=0; i<get_num_osds(); ++i) {
+    ASSERT_EQ(0u, osdmap.get_crush_node_flags(i));
+  }
+
+  OSDMap::Incremental inc(osdmap.get_epoch() + 1);
+  inc.new_crush_node_flags[-1] = 123u;
+  osdmap.apply_incremental(inc);
+  for (unsigned i=0; i<get_num_osds(); ++i) {
+    ASSERT_EQ(123u, osdmap.get_crush_node_flags(i));
+  }
+  ASSERT_EQ(0u, osdmap.get_crush_node_flags(1000));
+
+  OSDMap::Incremental inc3(osdmap.get_epoch() + 1);
+  inc3.new_crush_node_flags[-1] = 456u;
+  osdmap.apply_incremental(inc3);
+  for (unsigned i=0; i<get_num_osds(); ++i) {
+    ASSERT_EQ(456u, osdmap.get_crush_node_flags(i));
+  }
+  ASSERT_EQ(0u, osdmap.get_crush_node_flags(1000));
+
+  OSDMap::Incremental inc2(osdmap.get_epoch() + 1);
+  inc2.new_crush_node_flags[-1] = 0;
+  osdmap.apply_incremental(inc2);
+  for (unsigned i=0; i<get_num_osds(); ++i) {
+    ASSERT_EQ(0u, osdmap.get_crush_node_flags(i));
+  }
+}
+
 TEST_F(OSDMapTest, parse_osd_id_list) {
   set_up_map();
   set<int> out;