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;
}
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);
/*
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);