]> git-server-git.apps.pok.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>
Tue, 16 Apr 2019 22:22:52 +0000 (17:22 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 6578ce0539f8b4a70f04e9de9f3993f56b085d9c)

src/osd/OSDMap.cc
src/osd/OSDMap.h
src/test/osd/TestOSDMap.cc

index c2438d17c7503bcce9006dbfc50bcd9a262872bc..15786872b406a1f3064527a676ac4e0604a1aead 100644 (file)
@@ -5825,3 +5825,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 3cfa2e65d809bc4791b32b987e5bf4cf1afc2e15..49bc62a365db0c9825418c33868ddab83033339e 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;