From d9c1d868a344e1ea96bff1fe67988a2bbe7f913a Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 17 Nov 2016 17:14:05 +0100 Subject: [PATCH] rgw: add support for the prefix parameter in account listing of Swift API. Fixes: http://tracker.ceph.com/issues/17931 Signed-off-by: Radoslaw Zarzynski (cherry picked from commit 0e0a14a70f688e29c1993b723d64ec99a55f3677) --- src/rgw/rgw_rest_swift.cc | 19 +++++++++++++------ src/rgw/rgw_rest_swift.h | 1 + 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index e824447d998..a18e6921ade 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -23,6 +23,7 @@ int RGWListBuckets_ObjStore_SWIFT::get_params() { + prefix = s->info.args.get("prefix"); marker = s->info.args.get("marker"); end_marker = s->info.args.get("end_marker"); @@ -144,14 +145,20 @@ void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets) void RGWListBuckets_ObjStore_SWIFT::send_response_data(RGWUserBuckets& buckets) { - map& m = buckets.get_buckets(); - map::iterator iter; - - if (!sent_data) + if (! sent_data) { return; + } - for (iter = m.begin(); iter != m.end(); ++iter) { + /* Take care of the prefix parameter of Swift API. There is no business + * in applying the filter earlier as we really need to go through all + * entries regardless of it (the headers like X-Account-Container-Count + * aren't affected by specifying prefix). */ + const std::map& m = buckets.get_buckets(); + for (auto iter = m.lower_bound(prefix); + iter != m.end() && boost::algorithm::starts_with(iter->first, prefix); + ++iter) { const RGWBucketEnt& obj = iter->second; + s->formatter->open_object_section("container"); s->formatter->dump_string("name", obj.bucket.name); if (need_stats) { @@ -159,7 +166,7 @@ void RGWListBuckets_ObjStore_SWIFT::send_response_data(RGWUserBuckets& buckets) s->formatter->dump_int("bytes", obj.size); } s->formatter->close_section(); - if (!g_conf->rgw_swift_enforce_content_length) { + if (! g_conf->rgw_swift_enforce_content_length) { rgw_flush_formatter(s, s->formatter); } } diff --git a/src/rgw/rgw_rest_swift.h b/src/rgw/rgw_rest_swift.h index 0c4b1e25100..08b3594653a 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -21,6 +21,7 @@ public: class RGWListBuckets_ObjStore_SWIFT : public RGWListBuckets_ObjStore { bool need_stats; + std::string prefix; uint64_t get_default_max() const override { return 0; -- 2.47.3