From aa5113e1700f1aba27e20520b0f49c513b41f74c Mon Sep 17 00:00:00 2001 From: Tianshan Qu Date: Fri, 3 Nov 2017 15:53:41 +0800 Subject: [PATCH] rgw: fix cls_bucket_head result order consistency headers's key is string but bucket_instance_ids's key is int looked around and found no one use header's key, so change header from map to vector Signed-off-by: Tianshan Qu (cherry picked from commit 46657a0f72530f50f1c94374a27edb57deb70de0) Conflicts: src/rgw/rgw_rados.h: unordered bucket listing --- src/rgw/rgw_rados.cc | 44 ++++++++++++++++++++++---------------------- src/rgw/rgw_rados.h | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index ff4ac695954fe..6a24c5ba3f557 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -11966,7 +11966,7 @@ int RGWRados::raw_obj_stat(rgw_raw_obj& obj, uint64_t *psize, real_time *pmtime, int RGWRados::get_bucket_stats(RGWBucketInfo& bucket_info, int shard_id, string *bucket_ver, string *master_ver, map& stats, string *max_marker, bool *syncstopped) { - map headers; + vector headers; map bucket_instance_ids; int r = cls_bucket_head(bucket_info, shard_id, headers, &bucket_instance_ids); if (r < 0) { @@ -11975,25 +11975,25 @@ int RGWRados::get_bucket_stats(RGWBucketInfo& bucket_info, int shard_id, string assert(headers.size() == bucket_instance_ids.size()); - map::iterator iter = headers.begin(); + auto iter = headers.begin(); map::iterator viter = bucket_instance_ids.begin(); BucketIndexShardsManager ver_mgr; BucketIndexShardsManager master_ver_mgr; BucketIndexShardsManager marker_mgr; char buf[64]; for(; iter != headers.end(); ++iter, ++viter) { - accumulate_raw_stats(iter->second, stats); - snprintf(buf, sizeof(buf), "%lu", (unsigned long)iter->second.ver); + accumulate_raw_stats(*iter, stats); + snprintf(buf, sizeof(buf), "%lu", (unsigned long)iter->ver); ver_mgr.add(viter->first, string(buf)); - snprintf(buf, sizeof(buf), "%lu", (unsigned long)iter->second.master_ver); + snprintf(buf, sizeof(buf), "%lu", (unsigned long)iter->master_ver); master_ver_mgr.add(viter->first, string(buf)); if (shard_id >= 0) { - *max_marker = iter->second.max_marker; + *max_marker = iter->max_marker; } else { - marker_mgr.add(viter->first, iter->second.max_marker); + marker_mgr.add(viter->first, iter->max_marker); } if (syncstopped != NULL) - *syncstopped = iter->second.syncstopped; + *syncstopped = iter->syncstopped; } ver_mgr.to_string(bucket_ver); master_ver_mgr.to_string(master_ver); @@ -12006,7 +12006,7 @@ int RGWRados::get_bucket_stats(RGWBucketInfo& bucket_info, int shard_id, string int RGWRados::get_bi_log_status(RGWBucketInfo& bucket_info, int shard_id, map& markers) { - map headers; + vector headers; map bucket_instance_ids; int r = cls_bucket_head(bucket_info, shard_id, headers, &bucket_instance_ids); if (r < 0) @@ -12014,14 +12014,14 @@ int RGWRados::get_bi_log_status(RGWBucketInfo& bucket_info, int shard_id, assert(headers.size() == bucket_instance_ids.size()); - map::iterator iter = headers.begin(); + auto iter = headers.begin(); map::iterator viter = bucket_instance_ids.begin(); for(; iter != headers.end(); ++iter, ++viter) { if (shard_id >= 0) { - markers[shard_id] = iter->second.max_marker; + markers[shard_id] = iter->max_marker; } else { - markers[viter->first] = iter->second.max_marker; + markers[viter->first] = iter->max_marker; } } return 0; @@ -12573,7 +12573,7 @@ int RGWRados::update_containers_stats(map& m) ent.size = 0; ent.size_rounded = 0; - map headers; + vector headers; RGWBucketInfo bucket_info; int ret = get_bucket_instance_info(obj_ctx, bucket, bucket_info, NULL, NULL); @@ -12585,11 +12585,11 @@ int RGWRados::update_containers_stats(map& m) if (r < 0) return r; - map::iterator hiter = headers.begin(); + auto hiter = headers.begin(); for (; hiter != headers.end(); ++hiter) { RGWObjCategory category = main_category; - map::iterator iter = (hiter->second.stats).find((uint8_t)category); - if (iter != hiter->second.stats.end()) { + map::iterator iter = (hiter->stats).find((uint8_t)category); + if (iter != hiter->stats.end()) { struct rgw_bucket_category_stats& stats = iter->second; ent.count += stats.num_entries; ent.size += stats.total_size; @@ -13641,7 +13641,7 @@ int RGWRados::check_disk_state(librados::IoCtx io_ctx, return 0; } -int RGWRados::cls_bucket_head(const RGWBucketInfo& bucket_info, int shard_id, map& headers, map *bucket_instance_ids) +int RGWRados::cls_bucket_head(const RGWBucketInfo& bucket_info, int shard_id, vector& headers, map *bucket_instance_ids) { librados::IoCtx index_ctx; map oids; @@ -13656,7 +13656,7 @@ int RGWRados::cls_bucket_head(const RGWBucketInfo& bucket_info, int shard_id, ma map::iterator iter = list_results.begin(); for(; iter != list_results.end(); ++iter) { - headers[oids[iter->first]] = iter->second.dir.header; + headers.push_back(std::move(iter->second.dir.header)); } return 0; } @@ -13745,7 +13745,7 @@ int RGWRados::cls_user_get_header_async(const string& user_id, RGWGetUserHeader_ int RGWRados::cls_user_sync_bucket_stats(rgw_raw_obj& user_obj, const RGWBucketInfo& bucket_info) { - map headers; + vector headers; int r = cls_bucket_head(bucket_info, RGW_NO_SHARD, headers); if (r < 0) { ldout(cct, 20) << "cls_bucket_header() returned " << r << dendl; @@ -13757,7 +13757,7 @@ int RGWRados::cls_user_sync_bucket_stats(rgw_raw_obj& user_obj, const RGWBucketI bucket_info.bucket.convert(&entry.bucket); for (const auto& hiter : headers) { - for (const auto& iter : hiter.second.stats) { + for (const auto& iter : hiter.stats) { const struct rgw_bucket_category_stats& header_stats = iter.second; entry.size += header_stats.total_size; entry.size_rounded += header_stats.total_size_rounded; @@ -13779,7 +13779,7 @@ int RGWRados::cls_user_sync_bucket_stats(rgw_raw_obj& user_obj, const RGWBucketI int RGWRados::cls_user_get_bucket_stats(const rgw_bucket& bucket, cls_user_bucket_entry& entry) { - map headers; + vector headers; RGWBucketInfo bucket_info; RGWObjectCtx obj_ctx(this); int ret = get_bucket_instance_info(obj_ctx, bucket, bucket_info, NULL, NULL); @@ -13796,7 +13796,7 @@ int RGWRados::cls_user_get_bucket_stats(const rgw_bucket& bucket, cls_user_bucke bucket.convert(&entry.bucket); for (const auto& hiter : headers) { - for (const auto& iter : hiter.second.stats) { + for (const auto& iter : hiter.stats) { const struct rgw_bucket_category_stats& header_stats = iter.second; entry.size += header_stats.total_size; entry.size_rounded += header_stats.total_size_rounded; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index cd462fe20893f..e90e17a7ef0d9 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -3542,7 +3542,7 @@ public: vector& ent_list, bool *is_truncated, rgw_obj_index_key *last_entry, bool (*force_check_filter)(const string& name) = nullptr); - int cls_bucket_head(const RGWBucketInfo& bucket_info, int shard_id, map& headers, map *bucket_instance_ids = NULL); + int cls_bucket_head(const RGWBucketInfo& bucket_info, int shard_id, vector& headers, map *bucket_instance_ids = NULL); int cls_bucket_head_async(const RGWBucketInfo& bucket_info, int shard_id, RGWGetDirHeader_CB *ctx, int *num_aio); int list_bi_log_entries(RGWBucketInfo& bucket_info, int shard_id, string& marker, uint32_t max, std::list& result, bool *truncated); int trim_bi_log_entries(RGWBucketInfo& bucket_info, int shard_id, string& marker, string& end_marker); -- 2.39.5