From: Sage Weil Date: Sat, 2 Nov 2013 17:58:30 +0000 (-0700) Subject: crush: add a few unit tests for INDEP mode X-Git-Tag: v0.74~16^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0b9bb54448a472cbb85956ff7bef4bcb5cf5aae7;p=ceph.git crush: add a few unit tests for INDEP mode Signed-off-by: Sage Weil --- diff --git a/src/test/Makefile.am b/src/test/Makefile.am index b1cbf9fac990..80098e5d1c9c 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -278,6 +278,11 @@ unittest_util_CXXFLAGS = $(UNITTEST_CXXFLAGS) unittest_util_LDADD = $(LIBCOMMON) -lm $(UNITTEST_LDADD) $(CRYPTO_LIBS) $(EXTRALIBS) check_PROGRAMS += unittest_util +unittest_crush_indep_SOURCES = test/crush/indep.cc +unittest_crush_indep_CXXFLAGS = $(UNITTEST_CXXFLAGS) +unittest_crush_indep_LDADD = $(LIBCOMMON) -lm $(UNITTEST_LDADD) $(CEPH_CRUSH) $(EXTRALIBS) $(CEPH_GLOBAL) +check_PROGRAMS += unittest_crush_indep + unittest_workqueue_SOURCES = test/test_workqueue.cc unittest_workqueue_CXXFLAGS = $(UNITTEST_CXXFLAGS) unittest_workqueue_LDADD = $(UNITTEST_LDADD) $(CEPH_GLOBAL) diff --git a/src/test/crush/indep.cc b/src/test/crush/indep.cc new file mode 100644 index 000000000000..1025a27e4cdd --- /dev/null +++ b/src/test/crush/indep.cc @@ -0,0 +1,258 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2013 Inktank + * + * LGPL2.1 (see COPYING-LGPL2.1) or later + */ + +#include +#include + +#include "include/stringify.h" +#include "common/ceph_argparse.h" +#include "global/global_init.h" +#include "global/global_context.h" + +#include "crush/CrushWrapper.h" + +#include + +CrushWrapper *build_indep_map(CephContext *cct, int num_rack, int num_host, + int num_osd) +{ + CrushWrapper *c = new CrushWrapper; + c->create(); + + c->set_type_name(5, "root"); + c->set_type_name(4, "row"); + c->set_type_name(3, "rack"); + c->set_type_name(2, "chasis"); + c->set_type_name(1, "host"); + c->set_type_name(0, "osd"); + + int rootno; + c->add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_RJENKINS1, + 5, 0, NULL, NULL, &rootno); + c->set_item_name(rootno, "default"); + + map loc; + loc["root"] = "default"; + + int osd = 0; + for (int r=0; rinsert_item(cct, osd, 1.0, string("osd.") + stringify(osd), loc); + } + } + } + + crush_rule *rule = crush_make_rule(3, 0, 123, 1, 20); + assert(rule); + crush_rule_set_step(rule, 0, CRUSH_RULE_TAKE, rootno, 0); + crush_rule_set_step(rule, 1, + CRUSH_RULE_CHOOSE_LEAF_INDEP, + CRUSH_CHOOSE_N, + 1); + crush_rule_set_step(rule, 2, CRUSH_RULE_EMIT, 0, 0); + int rno = crush_add_rule(c->crush, rule, -1); + c->set_rule_name(rno, "data"); + + if (false) { + Formatter *f = new_formatter("json-pretty"); + f->open_object_section("crush_map"); + c->dump(f); + f->close_section(); + f->flush(cout); + delete f; + } + + return c; +} + +int get_num_dups(const vector& v) +{ + std::set s; + int dups = 0; + for (unsigned i=0; i weight(c->get_max_devices(), 0x10000); + c->dump_tree(weight, &cout, NULL); + + for (int x = 0; x < 100; ++x) { + vector out; + c->do_rule(0, x, out, 5, weight); + cout << x << " -> " << out << std::endl; + int num_none = 0; + for (unsigned i=0; i weight(c->get_max_devices(), 0x10000); + c->dump_tree(weight, &cout, NULL); + + for (int x = 0; x < 100; ++x) { + vector out; + c->do_rule(0, x, out, 5, weight); + cout << x << " -> " << out << std::endl; + int num_none = 0; + for (unsigned i=0; i weight(c->get_max_devices(), 0x10000); + + // mark a bunch of osds out + int num = 3*3*3; + for (int i=0; idump_tree(weight, &cout, NULL); + + // need more retries to get 9/9 hosts for x in 0..99 + c->crush->choose_total_tries = 100; + for (int x = 0; x < 100; ++x) { + vector out; + c->do_rule(0, x, out, 9, weight); + cout << x << " -> " << out << std::endl; + int num_none = 0; + for (unsigned i=0; i weight(c->get_max_devices(), 0x10000); + + // mark a bunch of osds out + int num = 3*3*3; + for (int i=0; idump_tree(weight, &cout, NULL); + + c->crush->choose_total_tries = 100; + for (int x = 0; x < 100; ++x) { + vector out; + c->do_rule(0, x, out, 7, weight); + cout << x << " -> " << out << std::endl; + int num_none = 0; + for (unsigned i=0; icrush->choose_total_tries = 100; + vector<__u32> tweight(c->get_max_devices(), 0x10000); + c->dump_tree(tweight, &cout, NULL); + + int tchanged = 0; + for (int x = 1; x < 5; ++x) { + vector<__u32> weight(c->get_max_devices(), 0x10000); + + std::map pos; + vector prev; + for (unsigned i=0; i out; + c->do_rule(0, x, out, 7, weight); + cout << "(" << i << "/" << weight.size() << " out) " + << x << " -> " << out << std::endl; + int num_none = 0; + for (unsigned k=0; k args; + argv_to_vec(argc, (const char **)argv, args); + + global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0); + common_init_finish(g_ceph_context); + + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}