]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crush: implement split_id_class
authorLoic Dachary <ldachary@redhat.com>
Sat, 18 Feb 2017 22:10:59 +0000 (23:10 +0100)
committerLoic Dachary <ldachary@redhat.com>
Wed, 1 Mar 2017 16:24:08 +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 d989fe9250f3cc39e04208e15ac1cc8bd298d0b5..527abe526960b75c27dfca03de97b3612b1c4ed7 100644 (file)
@@ -104,6 +104,28 @@ bool CrushWrapper::is_v5_rule(unsigned ruleid) const
   return false;
 }
 
+int CrushWrapper::split_id_class(int i, int *idout, int *classout) const
+{
+  if (!item_exists(i))
+    return -EINVAL;
+  string name = get_item_name(i);
+  size_t pos = name.find("~");
+  if (pos == string::npos) {
+    *idout = i;
+    *classout = -1;
+    return 0;
+  }
+  string name_no_class = name.substr(0, pos);
+  if (!name_exists(name_no_class))
+    return -ENOENT;
+  string class_name = name.substr(pos + 1);
+  if (!class_exists(class_name))
+    return -ENOENT;
+  *idout = get_item_id(name_no_class);
+  *classout = get_class_id(class_name);
+  return 0;
+}
+
 int CrushWrapper::can_rename_item(const string& srcname,
                                   const string& dstname,
                                   ostream *ss) const
index 11fd1a34b7bb6e6c213d0f7b8b6f777f935f61d5..a265004dcb1435f84f791da9c965f6b971506693 100644 (file)
@@ -397,7 +397,11 @@ public:
       name_rmap[name] = i;
     return 0;
   }
+  int split_id_class(int i, int *idout, int *classout) const;
 
+  bool class_exists(const string& name) const {
+    return class_rname.count(name);
+  }
   const char *get_class_name(int i) const {
     std::map<int,string>::const_iterator p = class_name.find(i);
     if (p != class_name.end())
index 1d5b2554f6cf77e08db6782468874acd4a84f56c..f734efb3aaa23a7ebeb4f2a9bf4e0af7a821c8f4 100644 (file)
@@ -1012,6 +1012,34 @@ TEST(CrushWrapper, device_class_clone) {
   ASSERT_EQ(c.device_class_clone(root_id, 12345, &other_clone_id), -EBADF);
 }
 
+TEST(CrushWrapper, split_id_class) {
+  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;
+
+  int item_id = c.get_item_id("default");
+  int clone_id;
+  ASSERT_EQ(c.device_class_clone(item_id, class_id, &clone_id), 0);
+  int retrieved_item_id;
+  int retrieved_class_id;
+  ASSERT_EQ(c.split_id_class(clone_id, &retrieved_item_id, &retrieved_class_id), 0);
+  ASSERT_EQ(item_id, retrieved_item_id);
+  ASSERT_EQ(class_id, retrieved_class_id);
+
+  ASSERT_EQ(c.split_id_class(item_id, &retrieved_item_id, &retrieved_class_id), 0);
+  ASSERT_EQ(item_id, retrieved_item_id);
+  ASSERT_EQ(-1, retrieved_class_id);
+}
+
 int main(int argc, char **argv) {
   vector<const char*> args;
   argv_to_vec(argc, (const char **)argv, args);