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: v11.1.0~121^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0e0a14a70f688e29c1993b723d64ec99a55f3677;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 --- diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 40cfda218a8..874663246ac 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -35,6 +35,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"); @@ -170,14 +171,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) { @@ -185,7 +192,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 a6ad103905a..d4a3f038416 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -32,6 +32,7 @@ public: class RGWListBuckets_ObjStore_SWIFT : public RGWListBuckets_ObjStore { bool need_stats; + std::string prefix; uint64_t get_default_max() const override { return 0;