diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-06 19:32:21 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-03-08 06:55:03 -0800 |
commit | 6669e73fa50e3908ec825ee030c31a6dbede6ac0 (patch) | |
tree | 93f0216171f5ec0469f5aa14f56afee0afde1a46 | |
parent | 1e2864a0209ad5daa4a7cd58b6e7cbc9f46d3e94 (diff) | |
download | ceph-6669e73fa50e3908ec825ee030c31a6dbede6ac0.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>
-rw-r--r-- | src/rgw/rgw_rados.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 9675a75b63b..ad5485ffe5a 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -689,11 +689,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; @@ -707,8 +718,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; @@ -732,6 +751,7 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string& } } while (truncated && count < max); +done: if (is_truncated) *is_truncated = truncated; |