From: Loic Dachary Date: Sat, 18 Feb 2017 22:10:59 +0000 (+0100) Subject: crush: implement split_id_class X-Git-Tag: v12.0.1~135^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=09e4d4029f95499a75935d5503d93a73ecc7c745;p=ceph.git crush: implement split_id_class Refs: http://tracker.ceph.com/issues/18943 Signed-off-by: Loic Dachary --- diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index d989fe9250f..527abe52696 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -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 diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h index 11fd1a34b7b..a265004dcb1 100644 --- a/src/crush/CrushWrapper.h +++ b/src/crush/CrushWrapper.h @@ -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::const_iterator p = class_name.find(i); if (p != class_name.end()) diff --git a/src/test/crush/CrushWrapper.cc b/src/test/crush/CrushWrapper.cc index 1d5b2554f6c..f734efb3aaa 100644 --- a/src/test/crush/CrushWrapper.cc +++ b/src/test/crush/CrushWrapper.cc @@ -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 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 args; argv_to_vec(argc, (const char **)argv, args);