From: Radoslaw Zarzynski Date: Thu, 17 Nov 2016 16:14:05 +0000 (+0100) Subject: rgw: add support for the prefix parameter in account listing of Swift API. X-Git-Tag: v10.2.6~71^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d9c1d868a344e1ea96bff1fe67988a2bbe7f913a;p=ceph.git 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) --- 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;