From aa9e309c339b4c3b78e9ec0f0c138ef1fa532554 Mon Sep 17 00:00:00 2001 From: lvshuhua Date: Sun, 29 Sep 2019 19:09:33 +0800 Subject: [PATCH] tools: add maxread in rados listomapkeys could avoid a long wait when to search in large omap range Signed-off-by: lvshuhua --- src/tools/rados/rados.cc | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/tools/rados/rados.cc b/src/tools/rados/rados.cc index c90b3ec7a2b..3e3cae88bcd 100644 --- a/src/tools/rados/rados.cc +++ b/src/tools/rados/rados.cc @@ -407,6 +407,7 @@ void dump_name(Formatter *formatter, const librados::NObjectIterator& i, [[maybe } // namespace detail unsigned default_op_size = 1 << 22; +static const unsigned MAX_OMAP_BYTES_PER_REQUEST = 1 << 10; [[noreturn]] static void usage_exit() { @@ -2870,10 +2871,9 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, string oid(nargs[1]); string last_read = ""; - int MAX_READ = 512; do { map values; - ret = io_ctx.omap_get_vals(oid, last_read, MAX_READ, &values); + ret = io_ctx.omap_get_vals(oid, last_read, MAX_OMAP_BYTES_PER_REQUEST, &values); if (ret < 0) { cerr << "error getting omap keys " << pool_name << "/" << oid << ": " << cpp_strerror(ret) << std::endl; @@ -2898,7 +2898,7 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, it->second.hexdump(cout); cout << std::endl; } - } while (ret == MAX_READ); + } while (ret == MAX_OMAP_BYTES_PER_REQUEST); ret = 0; } else if (strcmp(nargs[0], "cp") == 0) { @@ -3342,18 +3342,22 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, return 1; } - set out_keys; - ret = io_ctx.omap_get_keys(nargs[1], "", LONG_MAX, &out_keys); - if (ret < 0) { - cerr << "error getting omap key set " << pool_name << "/" - << nargs[1] << ": " << cpp_strerror(ret) << std::endl; - return 1; - } + string last_read; + bool more = true; + do { + set out_keys; + ret = io_ctx.omap_get_keys2(nargs[1], last_read, MAX_OMAP_BYTES_PER_REQUEST, &out_keys, &more); + if (ret < 0) { + cerr << "error getting omap key set " << pool_name << "/" + << nargs[1] << ": " << cpp_strerror(ret) << std::endl; + return 1; + } - for (set::iterator iter = out_keys.begin(); - iter != out_keys.end(); ++iter) { - cout << *iter << std::endl; - } + for (auto &key : out_keys) { + cout << key << std::endl; + last_read = std::move(key); + } + } while (more); } else if (strcmp(nargs[0], "lock") == 0) { if (!pool_name) { usage(cerr); -- 2.39.5