]> git-server-git.apps.pok.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:03:35 +0000 (07:03 -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 04fd97330ae15b7c04c48153f5e72f4aa956b78f..b55bd63d97c74312caa205e2fac2c0b781610899 100644 (file)
@@ -688,11 +688,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;
@@ -706,8 +717,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;
@@ -731,6 +750,7 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string&
     }
   } while (truncated && count < max);
 
+done:
   if (is_truncated)
     *is_truncated = truncated;