From: Kefu Chai Date: Sat, 10 Jun 2017 15:58:47 +0000 (+0800) Subject: test/librados: extract functions using libcommon in test.cc into test_common.cc X-Git-Tag: v12.1.0~112^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=82a848c2053ea69ebc6d3ec1003e18921e2d08d2;p=ceph.git test/librados: extract functions using libcommon in test.cc into test_common.cc Fixes: http://tracker.ceph.com/issues/20175 Signed-off-by: Kefu Chai --- diff --git a/src/test/librados/CMakeLists.txt b/src/test/librados/CMakeLists.txt index 2194a3e1fa67..64b5c323363a 100644 --- a/src/test/librados/CMakeLists.txt +++ b/src/test/librados/CMakeLists.txt @@ -1,8 +1,11 @@ -# radostest +# radostest +add_library(libradostest_obj OBJECT test.cc) set(libradostest_srcs - test.cc + test_common.cc TestCase.cc) -add_library(radostest STATIC ${libradostest_srcs}) +add_library(radostest STATIC + ${libradostest_srcs} + $) target_link_libraries(radostest ceph-common json_spirit ${EXTRALIBS}) set_target_properties(radostest PROPERTIES COMPILE_FLAGS ${UNITTEST_CXX_FLAGS}) diff --git a/src/test/librados/list.cc b/src/test/librados/list.cc index f3ca8107d9d9..db90ac80c3aa 100644 --- a/src/test/librados/list.cc +++ b/src/test/librados/list.cc @@ -4,6 +4,7 @@ #include "include/rados/librados.hpp" #include "include/stringify.h" #include "test/librados/test.h" +#include "test/librados/test_common.h" #include "test/librados/TestCase.h" #include "global/global_context.h" diff --git a/src/test/librados/test.cc b/src/test/librados/test.cc index af34c3ac284f..ac1e55fba800 100644 --- a/src/test/librados/test.cc +++ b/src/test/librados/test.cc @@ -6,9 +6,6 @@ #include "test/librados/test.h" #include "include/stringify.h" -#include "common/Formatter.h" -#include "json_spirit/json_spirit.h" -#include "common/errno.h" #include "common/ceph_context.h" #include "common/config.h" @@ -36,97 +33,6 @@ std::string get_temp_pool_name(const std::string &prefix) return prefix + out; } -int wait_for_healthy(rados_t *cluster) -{ - bool healthy = false; - // This timeout is very long because the tests are sometimes - // run on a thrashing cluster - int timeout = 3600; - int slept = 0; - - while(!healthy) { - JSONFormatter cmd_f; - cmd_f.open_object_section("command"); - cmd_f.dump_string("prefix", "status"); - cmd_f.dump_string("format", "json"); - cmd_f.close_section(); - std::ostringstream cmd_stream; - cmd_f.flush(cmd_stream); - const std::string serialized_cmd = cmd_stream.str(); - - const char *cmd[2]; - cmd[1] = NULL; - cmd[0] = serialized_cmd.c_str(); - - char *outbuf = NULL; - size_t outlen = 0; - int ret = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, - &outbuf, &outlen, NULL, NULL); - if (ret) { - return ret; - } - - std::string out(outbuf, outlen); - rados_buffer_free(outbuf); - - json_spirit::mValue root; - assert(json_spirit::read(out, root)); - json_spirit::mObject root_obj = root.get_obj(); - json_spirit::mObject pgmap = root_obj["pgmap"].get_obj(); - json_spirit::mArray pgs_by_state = pgmap["pgs_by_state"].get_array(); - - if (pgs_by_state.size() == 1) { - json_spirit::mObject state = pgs_by_state[0].get_obj(); - std::string state_name = state["state_name"].get_str(); - if (state_name != std::string("active+clean")) { - healthy = false; - } else { - healthy = true; - } - - } else { - healthy = false; - } - - if (slept >= timeout) { - return -ETIMEDOUT; - }; - - if (!healthy) { - sleep(1); - slept += 1; - } - } - - return 0; -} - -int rados_pool_set( - rados_t *cluster, - const std::string &pool_name, - const std::string &var, - const std::string &val) -{ - JSONFormatter cmd_f; - cmd_f.open_object_section("command"); - cmd_f.dump_string("prefix", "osd pool set"); - cmd_f.dump_string("pool", pool_name); - cmd_f.dump_string("var", var); - cmd_f.dump_string("val", val); - cmd_f.close_section(); - - std::ostringstream cmd_stream; - cmd_f.flush(cmd_stream); - - const std::string serialized_cmd = cmd_stream.str(); - - const char *cmd[2]; - cmd[1] = NULL; - cmd[0] = serialized_cmd.c_str(); - int ret = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, NULL, - NULL, NULL, NULL); - return ret; -} std::string create_one_pool( const std::string &pool_name, rados_t *cluster, uint32_t pg_num) @@ -191,35 +97,6 @@ int destroy_ec_profile_and_ruleset(rados_t *cluster, return destroy_ruleset(cluster, ruleset, oss); } -std::string set_pg_num( - rados_t *cluster, const std::string &pool_name, uint32_t pg_num) -{ - // Wait for 'creating' to clear - int r = wait_for_healthy(cluster); - if (r != 0) { - goto err; - } - - // Adjust pg_num - r = rados_pool_set(cluster, pool_name, "pg_num", stringify(pg_num)); - if (r != 0) { - goto err; - } - - // Wait for 'creating' to clear - r = wait_for_healthy(cluster); - if (r != 0) { - goto err; - } - - return ""; - -err: - rados_shutdown(*cluster); - std::ostringstream oss; - oss << __func__ << "(" << pool_name << ") failed with error " << r; - return oss.str(); -} std::string create_one_ec_pool(const std::string &pool_name, rados_t *cluster) { @@ -415,7 +292,7 @@ std::string connect_cluster_pp(librados::Rados &cluster, if (ret) { std::ostringstream oss; oss << "failed to set config value " << setting.first << " to '" - << setting.second << "': " << cpp_strerror(ret); + << setting.second << "': " << strerror(-ret); return oss.str(); } } diff --git a/src/test/librados/test.h b/src/test/librados/test.h index 3d249787bf8d..8b505957fd08 100644 --- a/src/test/librados/test.h +++ b/src/test/librados/test.h @@ -34,9 +34,6 @@ std::string create_one_pool_pp(const std::string &pool_name, const std::map &config); std::string create_one_ec_pool_pp(const std::string &pool_name, librados::Rados &cluster); -std::string set_pg_num( - rados_t *cluster, const std::string &pool_name, uint32_t pg_num); - std::string connect_cluster(rados_t *cluster); std::string connect_cluster_pp(librados::Rados &cluster); std::string connect_cluster_pp(librados::Rados &cluster, diff --git a/src/test/librados/test_common.cc b/src/test/librados/test_common.cc new file mode 100644 index 000000000000..c276d33ff797 --- /dev/null +++ b/src/test/librados/test_common.cc @@ -0,0 +1,134 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "common/Formatter.h" +#include "include/stringify.h" +#include "json_spirit/json_spirit.h" +#include "test_common.h" + +namespace { + +using namespace ceph; + +int wait_for_healthy(rados_t *cluster) +{ + bool healthy = false; + // This timeout is very long because the tests are sometimes + // run on a thrashing cluster + int timeout = 3600; + int slept = 0; + + while(!healthy) { + JSONFormatter cmd_f; + cmd_f.open_object_section("command"); + cmd_f.dump_string("prefix", "status"); + cmd_f.dump_string("format", "json"); + cmd_f.close_section(); + std::ostringstream cmd_stream; + cmd_f.flush(cmd_stream); + const std::string serialized_cmd = cmd_stream.str(); + + const char *cmd[2]; + cmd[1] = NULL; + cmd[0] = serialized_cmd.c_str(); + + char *outbuf = NULL; + size_t outlen = 0; + int ret = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, + &outbuf, &outlen, NULL, NULL); + if (ret) { + return ret; + } + + std::string out(outbuf, outlen); + rados_buffer_free(outbuf); + + json_spirit::mValue root; + assert(json_spirit::read(out, root)); + json_spirit::mObject root_obj = root.get_obj(); + json_spirit::mObject pgmap = root_obj["pgmap"].get_obj(); + json_spirit::mArray pgs_by_state = pgmap["pgs_by_state"].get_array(); + + if (pgs_by_state.size() == 1) { + json_spirit::mObject state = pgs_by_state[0].get_obj(); + std::string state_name = state["state_name"].get_str(); + if (state_name != std::string("active+clean")) { + healthy = false; + } else { + healthy = true; + } + } else { + healthy = false; + } + + if (slept >= timeout) { + return -ETIMEDOUT; + }; + + if (!healthy) { + sleep(1); + slept += 1; + } + } + + return 0; +} + +int rados_pool_set( + rados_t *cluster, + const std::string &pool_name, + const std::string &var, + const std::string &val) +{ + JSONFormatter cmd_f; + cmd_f.open_object_section("command"); + cmd_f.dump_string("prefix", "osd pool set"); + cmd_f.dump_string("pool", pool_name); + cmd_f.dump_string("var", var); + cmd_f.dump_string("val", val); + cmd_f.close_section(); + + std::ostringstream cmd_stream; + cmd_f.flush(cmd_stream); + + const std::string serialized_cmd = cmd_stream.str(); + + const char *cmd[2]; + cmd[1] = NULL; + cmd[0] = serialized_cmd.c_str(); + int ret = rados_mon_command(*cluster, (const char **)cmd, 1, "", 0, NULL, + NULL, NULL, NULL); + return ret; +} + +} + +std::string set_pg_num( + rados_t *cluster, const std::string &pool_name, uint32_t pg_num) +{ + // Wait for 'creating' to clear + int r = wait_for_healthy(cluster); + if (r != 0) { + goto err; + } + + // Adjust pg_num + r = rados_pool_set(cluster, pool_name, "pg_num", stringify(pg_num)); + if (r != 0) { + goto err; + } + + // Wait for 'creating' to clear + r = wait_for_healthy(cluster); + if (r != 0) { + goto err; + } + + return ""; + +err: + rados_shutdown(*cluster); + std::ostringstream oss; + oss << __func__ << "(" << pool_name << ") failed with error " << r; + return oss.str(); +} diff --git a/src/test/librados/test_common.h b/src/test/librados/test_common.h new file mode 100644 index 000000000000..f3f1bdc494f1 --- /dev/null +++ b/src/test/librados/test_common.h @@ -0,0 +1,7 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -* +// vim: ts=8 sw=2 smarttab + +#include "include/rados/librados.h" + +std::string set_pg_num( + rados_t *cluster, const std::string &pool_name, uint32_t pg_num);