From d37d0339ff61a293f2f9fd6dff3fbd630efce2a0 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Fri, 19 Apr 2019 18:38:47 -0400 Subject: [PATCH] rgw: cls_bucket_list_unordered lists a single shard CLSRGWIssueBucketList sends the request to every shard, but this loop intended to list only the current_shard Fixes: http://tracker.ceph.com/issues/39393 Signed-off-by: Casey Bodley --- src/rgw/rgw_rados.cc | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 2f66f78ffbc..19192ef3221 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -9242,19 +9242,16 @@ int RGWRados::cls_bucket_list_unordered(RGWBucketInfo& bucket_info, while (count <= num_entries && ((shard_id >= 0 && current_shard == uint32_t(shard_id)) || current_shard < num_shards)) { - // key - oid (for different shards if there is any) - // value - list result for the corresponding oid (shard), it is filled by - // the AIO callback - map list_results; - r = CLSRGWIssueBucketList(index_ctx, marker, prefix, num_entries, - list_versions, oids, list_results, - cct->_conf->rgw_bucket_index_max_aio)(); + const std::string& oid = oids[current_shard]; + rgw_cls_list_ret result; + + librados::ObjectReadOperation op; + cls_rgw_bucket_list_op(op, marker, prefix, num_entries, + list_versions, &result); + r = index_ctx.operate(oid, &op, nullptr); if (r < 0) return r; - const std::string& oid = oids[current_shard]; - ceph_assert(list_results.find(current_shard) != list_results.end()); - auto& result = list_results[current_shard]; for (auto& entry : result.dir.m) { rgw_bucket_dir_entry& dirent = entry.second; -- 2.39.5