From ebd09a4c7aaa8788fe6fbc5ba80b0ea3308ca3e2 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 9 Dec 2016 14:34:46 -0800 Subject: [PATCH] rgw-admin: add marker to metadata list Signed-off-by: Yehuda Sadeh (cherry picked from commit ae600c2c3f765f409cb16557870ceb91d6714760) --- src/rgw/rgw_admin.cc | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index fb820e6384d0..840878040926 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -2396,6 +2396,7 @@ int main(int argc, const char **argv) string start_marker; string end_marker; int max_entries = -1; + bool max_entries_specified = false; int admin = false; bool admin_specified = false; int system = false; @@ -2557,6 +2558,7 @@ int main(int argc, const char **argv) max_buckets_specified = true; } else if (ceph_argparse_witharg(args, i, &val, "--max-entries", (char*)NULL)) { max_entries = (int)strict_strtol(val.c_str(), 10, &err); + max_entries_specified = true; if (!err.empty()) { cerr << "ERROR: failed to parse max entries: " << err << std::endl; return EINVAL; @@ -6093,31 +6095,47 @@ next: } void *handle; int max = 1000; - int ret = store->meta_mgr->list_keys_init(metadata_key, &handle); + int ret = store->meta_mgr->list_keys_init(metadata_key, marker, &handle); if (ret < 0) { cerr << "ERROR: can't get key: " << cpp_strerror(-ret) << std::endl; return -ret; } bool truncated; + uint64_t count = 0; + if (max_entries_specified) { + formatter->open_object_section("result"); + } formatter->open_array_section("keys"); + uint64_t left; do { list keys; - ret = store->meta_mgr->list_keys_next(handle, max, keys, &truncated); + left = (max_entries_specified ? max_entries - count : max); + ret = store->meta_mgr->list_keys_next(handle, left, keys, &truncated); if (ret < 0 && ret != -ENOENT) { cerr << "ERROR: lists_keys_next(): " << cpp_strerror(-ret) << std::endl; return -ret; } if (ret != -ENOENT) { for (list::iterator iter = keys.begin(); iter != keys.end(); ++iter) { formatter->dump_string("key", *iter); + ++count; } formatter->flush(cout); } - } while (truncated); + } while (truncated && left > 0); formatter->close_section(); + + if (max_entries_specified) { + encode_json("truncated", truncated, formatter); + encode_json("count", count, formatter); + if (truncated) { + encode_json("marker", store->meta_mgr->get_marker(handle), formatter); + } + formatter->close_section(); + } formatter->flush(cout); store->meta_mgr->list_keys_complete(handle); -- 2.47.3