From 14fcdb7b699185e6e4ca1f158d34b47c63f6563b Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 12 Jun 2017 11:55:04 +0800 Subject: [PATCH] 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 (cherry picked from commit 82a848c2053ea69ebc6d3ec1003e18921e2d08d2) Conflicts: since master has switched to cmake. the changes in this commit on .am files are ported from counterpart of CMakeLists.txt. --- src/test/Makefile-client.am | 1 + src/test/Makefile.am | 1 + src/test/librados/list.cc | 1 + src/test/librados/test.cc | 125 ---------------------------- src/test/librados/test_common.cc | 134 +++++++++++++++++++++++++++++++ src/test/librados/test_common.h | 7 ++ 6 files changed, 144 insertions(+), 125 deletions(-) create mode 100644 src/test/librados/test_common.cc create mode 100644 src/test/librados/test_common.h diff --git a/src/test/Makefile-client.am b/src/test/Makefile-client.am index 1346e0014ac96..e6da00305f69d 100644 --- a/src/test/Makefile-client.am +++ b/src/test/Makefile-client.am @@ -40,6 +40,7 @@ if WITH_RADOS libradostest_la_SOURCES = \ test/librados/test.cc \ + test/librados/test_common.cc \ test/librados/TestCase.cc noinst_LTLIBRARIES += libradostest.la libradostest_la_CXXFLAGS = $(UNITTEST_CXXFLAGS) diff --git a/src/test/Makefile.am b/src/test/Makefile.am index 480b7df2cb771..5f66a2db6c78c 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -523,6 +523,7 @@ noinst_HEADERS += \ test/objectstore/workload_generator.h \ test/kv_store_bench.h \ test/librados/test.h \ + test/librados/test_common.h \ test/librados/TestCase.h \ test/libradosstriper/TestCase.h \ test/ObjectMap/KeyValueDBMemory.h \ diff --git a/src/test/librados/list.cc b/src/test/librados/list.cc index b1d09a36a6e7f..f300f8e5336fa 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" #include "test/unit.h" diff --git a/src/test/librados/test.cc b/src/test/librados/test.cc index e09bee15bda19..8e2368c894adc 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 "errno.h" #include #include @@ -33,98 +30,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) { @@ -188,36 +93,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) { std::string err = connect_cluster(cluster); diff --git a/src/test/librados/test_common.cc b/src/test/librados/test_common.cc new file mode 100644 index 0000000000000..c276d33ff7973 --- /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 0000000000000..f3f1bdc494f10 --- /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); -- 2.39.5