return -ENOENT;
}
+bool CrushWrapper::class_is_in_use(int class_id)
+{
+ for (auto &i : class_bucket)
+ for (auto &j : i.second)
+ if (j.first == class_id)
+ return true;
+
+ for (auto &i : class_map)
+ if (i.second == class_id)
+ return true;
+
+ return false;
+}
+
int CrushWrapper::populate_classes()
{
set<int> roots;
else
return -EINVAL;
}
+ int remove_class_name(const string& name) {
+ std::map<string,int>::const_iterator p = class_rname.find(name);
+ if (p == class_rname.end())
+ return -ENOENT;
+ int class_id = p->second;
+ std::map<int,string>::const_iterator q = class_name.find(class_id);
+ if (q == class_name.end())
+ return -ENOENT;
+ class_rname.erase(name);
+ class_name.erase(class_id);
+ return 0;
+ }
int get_or_create_class_id(const string& name) {
int c = get_class_id(name);
if (c < 0) {
int update_device_class(CephContext *cct, int id, const string& class_name, const string& name);
int device_class_clone(int original, int device_class, int *clone);
+ bool class_is_in_use(int class_id);
int populate_classes();
int rebuild_roots_with_classes();
/* remove unused roots generated for class devices */
ASSERT_FALSE(c.name_exists("default~ssd"));
}
+TEST(CrushWrapper, class_is_in_use) {
+ CrushWrapper c;
+ c.create();
+ c.set_type_name(1, "root");
+
+ int weight = 1;
+ map<string,string> loc;
+ loc["root"] = "default";
+
+ ASSERT_FALSE(c.class_is_in_use(0));
+
+ 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_TRUE(c.class_is_in_use(c.get_class_id("ssd")));
+ ASSERT_EQ(0, c.remove_class_name("ssd"));
+ ASSERT_FALSE(c.class_is_in_use(c.get_class_id("ssd")));
+}
+
+TEST(CrushWrapper, remove_class_name) {
+ CrushWrapper c;
+ c.create();
+
+ ASSERT_EQ(-ENOENT, c.remove_class_name("ssd"));
+ ASSERT_GE(0, c.get_or_create_class_id("ssd"));
+ ASSERT_EQ(0, c.remove_class_name("ssd"));
+ ASSERT_EQ(-ENOENT, c.remove_class_name("ssd"));
+}
+
TEST(CrushWrapper, try_remap_rule) {
// build a simple 2 level map
CrushWrapper c;
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
+// Local Variables:
+// compile-command: "cd ../../../build ; make -j4 unittest_crush_wrapper && bin/unittest_crush_wrapper"
+// End: