From: Yehuda Sadeh Date: Fri, 27 Jan 2017 00:26:42 +0000 (-0800) Subject: rgw: fix use of marker in List::list_objects() X-Git-Tag: v11.2.1~69^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=ffe5bbfc6e09a47009dd281a38b35a8a3528812e;p=ceph.git rgw: fix use of marker in List::list_objects() Fixes: http://tracker.ceph.com/issues/18331 List marker is an index key, so treat it as such. This fixes infinite loop in orphans find command. Signed-off-by: Yehuda Sadeh (cherry picked from commit a5d1fa0587184f43c69d8e03114b58d43f320781) --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 47f3790b3313f..d7cea0d02c449 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -5103,21 +5103,20 @@ int RGWRados::Bucket::List::list_objects(int max, vector *result, result->clear(); - rgw_obj marker_obj, end_marker_obj, prefix_obj; - marker_obj.set_instance(params.marker.instance); - marker_obj.set_ns(params.ns); - marker_obj.set_obj(params.marker.name); - rgw_obj_key cur_marker; - marker_obj.get_index_key(&cur_marker); - - end_marker_obj.set_instance(params.end_marker.instance); - end_marker_obj.set_ns(params.ns); - end_marker_obj.set_obj(params.end_marker.name); + rgw_bucket b; + rgw_obj marker_obj(b, params.marker); + rgw_obj end_marker_obj(b, params.end_marker); + rgw_obj prefix_obj; rgw_obj_key cur_end_marker; - if (params.ns.empty()) { /* no support for end marker for namespaced objects */ + if (!params.ns.empty()) { + marker_obj.set_ns(params.ns); + end_marker_obj.set_ns(params.ns); end_marker_obj.get_index_key(&cur_end_marker); } - const bool cur_end_marker_valid = !cur_end_marker.empty(); + rgw_obj_key cur_marker; + marker_obj.get_index_key(&cur_marker); + + const bool cur_end_marker_valid = !params.end_marker.empty(); prefix_obj.set_ns(params.ns); prefix_obj.set_obj(params.prefix); @@ -5193,8 +5192,8 @@ int RGWRados::Bucket::List::list_objects(int max, vector *result, } if (count < max) { - params.marker = obj; - next_marker = obj; + params.marker = key; + next_marker = key; } if (params.filter && !params.filter->filter(obj.name, key.name))