summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-03-06 19:32:21 -0800
committerYehuda Sadeh <yehuda@inktank.com>2013-03-08 07:09:42 -0800
commita460fa145158666864ea073c97abff937304b39d (patch)
treee0fe1ecdac9a3094596eccffdf13479dcd9ce006
parent50b4f72eb74c4ae8238731ac3ceb40b5a21b79b6 (diff)
downloadceph-a460fa145158666864ea073c97abff937304b39d.tar.gz
rgw: don't iterate through all objects when in namespace
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)
-rw-r--r--src/rgw/rgw_rados.cc22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 552d8703c4e..e356dffc5d9 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -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;