]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't iterate through all objects when in namespace
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 7 Mar 2013 03:32:21 +0000 (19:32 -0800)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 8 Mar 2013 15:09:42 +0000 (07:09 -0800)
Fixes: #4363
Backport: argonaut, bobtail
When listing objects in namespace don't iterate through all the
objects, only go though the ones that starts with the namespace
prefix

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
(cherry picked from commit 6669e73fa50e3908ec825ee030c31a6dbede6ac0)

src/rgw/rgw_rados.cc

index 552d8703c4e5f4bf21da089aa480e4cb4720c178..e356dffc5d9cd50196628262da18b9ea5b959cc8 100644 (file)
@@ -509,11 +509,22 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string&
   int count = 0;
   string cur_marker = marker;
   bool truncated;
+  string ns_prefix;
 
   if (bucket_is_system(bucket)) {
     return -EINVAL;
   }
   result.clear();
+  if (!ns.empty()) {
+    ns_prefix = "_";
+    ns_prefix += ns + "_";
+    if (cur_marker < ns_prefix) {
+      cur_marker = ns_prefix;
+    } else if (cur_marker.substr(0, ns.size()) > ns_prefix) {
+      truncated = false;
+      goto done;
+    }
+  }
 
   do {
     std::map<string, RGWObjEnt> ent_map;
@@ -527,8 +538,16 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string&
       string obj = eiter->first;
       string key = obj;
 
-      if (!rgw_obj::translate_raw_obj_to_obj_in_ns(obj, ns))
+      if (!rgw_obj::translate_raw_obj_to_obj_in_ns(obj, ns)) {
+        if (!ns.empty()) {
+          /* we've iterated past the namespace we're searching -- done now */
+          truncated = false;
+          goto done;
+        }
+
+        /* we're not looking at the namespace this object is in, next! */
         continue;
+      }
 
       if (filter && !filter->filter(obj, key))
         continue;
@@ -552,6 +571,7 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string&
     }
   } while (truncated && count < max);
 
+done:
   if (is_truncated)
     *is_truncated = truncated;