]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crush: implement {populate,cleanup}_classes
authorLoic Dachary <ldachary@redhat.com>
Sat, 18 Feb 2017 22:33:39 +0000 (23:33 +0100)
committerLoic Dachary <ldachary@redhat.com>
Wed, 1 Mar 2017 16:24:09 +0000 (17:24 +0100)
Refs: http://tracker.ceph.com/issues/18943

Signed-off-by: Loic Dachary <ldachary@redhat.com>
src/crush/CrushWrapper.cc
src/crush/CrushWrapper.h
src/test/crush/CrushWrapper.cc

index 0e498d6555d251d53513b9780433e680787f14c8..81e08d62b769da98ca47703769d43bb3458e18ca 100644 (file)
@@ -1010,6 +1010,30 @@ int CrushWrapper::get_immediate_parent_id(int id, int *parent)
   return -ENOENT;
 }
 
+int CrushWrapper::populate_classes()
+{
+  set<int> roots;
+  find_roots(roots);
+  for (auto &r : roots) {
+    if (r >= 0)
+      continue;
+    if (id_has_class(r))
+      continue;
+    for (auto &c : class_name) {
+      int clone;
+      int res = device_class_clone(r, c.first, &clone);
+      if (res < 0)
+       return res;
+    }
+  }
+  return 0;
+}
+
+int CrushWrapper::cleanup_classes()
+{
+  return trim_roots_with_class();
+}
+
 int CrushWrapper::trim_roots_with_class()
 {
   set<int> takes;
index 7de67b94db0f606b653f93031b9e6a93e5e84a84..f81d2b17370082d6c379f13672341abeff5de987 100644 (file)
@@ -1089,8 +1089,11 @@ public:
   }
 
   int device_class_clone(int original, int device_class, int *clone);
+  int populate_classes();
   /* remove unused roots generated for class devices */
   int trim_roots_with_class();
+  int cleanup_classes();
+
   void start_choose_profile() {
     free(crush->choose_tries);
     /*
index ee774e9feefffbf361a85ce561a6bd8b2ae681ff..dd846e7d3fb6e4c2b69ff388ac85f187b3ca6e5e 100644 (file)
@@ -1070,6 +1070,29 @@ TEST(CrushWrapper, split_id_class) {
   ASSERT_EQ(-1, retrieved_class_id);
 }
 
+TEST(CrushWrapper, populate_and_cleanup_classes) {
+  CrushWrapper c;
+  c.create();
+  c.set_type_name(1, "root");
+
+  int weight = 1;
+  map<string,string> loc;
+  loc["root"] = "default";
+
+  int item = 1;
+  c.insert_item(g_ceph_context, item, weight, "osd.1", loc);
+  int class_id = c.get_or_create_class_id("ssd");
+  c.class_map[item] = class_id;
+
+  ASSERT_EQ(c.populate_classes(), 0);
+
+  ASSERT_TRUE(c.name_exists("default~ssd"));
+
+  c.class_bucket.clear();
+  ASSERT_EQ(c.cleanup_classes(), 0);
+  ASSERT_FALSE(c.name_exists("default~ssd"));
+}
+
 int main(int argc, char **argv) {
   vector<const char*> args;
   argv_to_vec(argc, (const char **)argv, args);