From 34aa7086ba5293ee4d008016558dcdb1ada02e83 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 16 Jul 2014 15:21:09 -0700 Subject: [PATCH] rgw: improve delmited listing of bucket If found a prefix, calculate a string greater than that so that next request we can skip to that. This is still not the most efficient way to do it. It'll be better to push it down to the objclass, but that'll require a much bigger change. Signed-off-by: Yehuda Sadeh (cherry picked from commit e6cf618c257f26f97f60a4c1df1d23a14496cab0) --- src/rgw/rgw_rados.cc | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 8875993cb92..cb84ab37faf 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3,6 +3,7 @@ #include #include "common/ceph_json.h" +#include "common/utf8.h" #include "common/errno.h" #include "common/Formatter.h" @@ -2106,7 +2107,28 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string& prefix_obj.set_obj(prefix); string cur_prefix = prefix_obj.object; + string bigger_than_delim; + + if (!delim.empty()) { + unsigned long val = decode_utf8((unsigned char *)delim.c_str(), delim.size()); + char buf[delim.size() + 16]; + int r = encode_utf8(val + 1, (unsigned char *)buf); + if (r < 0) { + ldout(cct,0) << "ERROR: encode_utf8() failed" << dendl; + return -EINVAL; + } + buf[r] = '\0'; + + bigger_than_delim = buf; + } + + string skip_after_delim; + do { + if (skip_after_delim > cur_marker) { + cur_marker = skip_after_delim; + ldout(cct, 20) << "setting cur_marker=" << cur_marker << dendl; + } std::map ent_map; int r = cls_bucket_list(bucket, cur_marker, cur_prefix, max - count, ent_map, &truncated, &cur_marker); @@ -2142,6 +2164,12 @@ int RGWRados::list_objects(rgw_bucket& bucket, int max, string& prefix, string& if (delim_pos >= 0) { common_prefixes[obj.substr(0, delim_pos + 1)] = true; + + skip_after_delim = obj.substr(0, delim_pos); + skip_after_delim.append(bigger_than_delim); + + ldout(cct, 20) << "skip_after_delim=" << skip_after_delim << dendl; + continue; } } -- 2.47.3