]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add support for the prefix parameter in account listing of Swift API. 12258/head
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 17 Nov 2016 16:14:05 +0000 (17:14 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 1 Dec 2016 14:06:09 +0000 (15:06 +0100)
Fixes: http://tracker.ceph.com/issues/17931
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit 0e0a14a70f688e29c1993b723d64ec99a55f3677)

src/rgw/rgw_rest_swift.cc
src/rgw/rgw_rest_swift.h

index e824447d9981aec7050beeb10b41042ae743b9e0..a18e6921ade457f1029a641e942fb77af3d1f74c 100644 (file)
@@ -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<string, RGWBucketEnt>& m = buckets.get_buckets();
-  map<string, RGWBucketEnt>::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<std::string, RGWBucketEnt>& 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);
     }
   }
index 0c4b1e25100cb113955a960bf0a4450a6e38b6f2..08b3594653a36e3223f62be656d01967c9f77f70 100644 (file)
@@ -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;