From dd712384ffe72ee23cbe0a20d7400aff7fb779a8 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 26 Sep 2016 10:45:17 -0700 Subject: [PATCH] rgw: bucket reshard updates stats Signed-off-by: Yehuda Sadeh --- src/cls/rgw/cls_rgw.cc | 18 +++++------------- src/cls/rgw/cls_rgw_client.h | 2 +- src/cls/rgw/cls_rgw_types.cc | 10 +++++++++- src/cls/rgw/cls_rgw_types.h | 11 ++++++++++- src/rgw/rgw_admin.cc | 20 +++++++++++++++++--- 5 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index fbdd70df031e7..3da8a44368188 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -59,9 +59,6 @@ cls_method_handle_t h_rgw_lc_get_head; cls_method_handle_t h_rgw_lc_list_entries; -#define ROUND_BLOCK_SIZE 4096 - - #define BI_PREFIX_CHAR 0x80 #define BI_BUCKET_OBJS_INDEX 0 @@ -79,11 +76,6 @@ static string bucket_index_prefixes[] = { "", /* special handling for the objs l /* this must be the last index */ "9999_",}; -static uint64_t get_rounded_size(uint64_t size) -{ - return (size + ROUND_BLOCK_SIZE - 1) & ~(ROUND_BLOCK_SIZE - 1); -} - static bool bi_is_objs_index(const string& s) { return ((unsigned char)s[0] != BI_PREFIX_CHAR); } @@ -543,7 +535,7 @@ static int check_index(cls_method_context_t hctx, struct rgw_bucket_dir_header * struct rgw_bucket_category_stats& stats = calc_header->stats[entry.meta.category]; stats.num_entries++; stats.total_size += entry.meta.accounted_size; - stats.total_size_rounded += get_rounded_size(entry.meta.accounted_size); + stats.total_size_rounded += cls_rgw_get_rounded_size(entry.meta.accounted_size); start_obj = kiter->first; } @@ -747,7 +739,7 @@ static void unaccount_entry(struct rgw_bucket_dir_header& header, struct rgw_buc struct rgw_bucket_category_stats& stats = header.stats[entry.meta.category]; stats.num_entries--; stats.total_size -= entry.meta.accounted_size; - stats.total_size_rounded -= get_rounded_size(entry.meta.accounted_size); + stats.total_size_rounded -= cls_rgw_get_rounded_size(entry.meta.accounted_size); } static void log_entry(const char *func, const char *str, struct rgw_bucket_dir_entry *entry) @@ -932,7 +924,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist entry.tag = op.tag; stats.num_entries++; stats.total_size += meta.accounted_size; - stats.total_size_rounded += get_rounded_size(meta.accounted_size); + stats.total_size_rounded += cls_rgw_get_rounded_size(meta.accounted_size); bufferlist new_key_bl; ::encode(entry, new_key_bl); int ret = cls_cxx_map_set_val(hctx, idx, &new_key_bl); @@ -1962,7 +1954,7 @@ int rgw_dir_suggest_changes(cls_method_context_t hctx, bufferlist *in, bufferlis CLS_LOG(10, "total_entries: %" PRId64 " -> %" PRId64 "\n", old_stats.num_entries, old_stats.num_entries - 1); old_stats.num_entries--; old_stats.total_size -= cur_disk.meta.accounted_size; - old_stats.total_size_rounded -= get_rounded_size(cur_disk.meta.accounted_size); + old_stats.total_size_rounded -= cls_rgw_get_rounded_size(cur_disk.meta.accounted_size); header_changed = true; } struct rgw_bucket_category_stats& stats = @@ -1989,7 +1981,7 @@ int rgw_dir_suggest_changes(cls_method_context_t hctx, bufferlist *in, bufferlis cur_change.key.name.c_str(), cur_change.key.instance.c_str(), stats.num_entries, stats.num_entries + 1); stats.num_entries++; stats.total_size += cur_change.meta.accounted_size; - stats.total_size_rounded += get_rounded_size(cur_change.meta.accounted_size); + stats.total_size_rounded += cls_rgw_get_rounded_size(cur_change.meta.accounted_size); header_changed = true; cur_change.index_ver = header.ver; bufferlist cur_state_bl; diff --git a/src/cls/rgw/cls_rgw_client.h b/src/cls/rgw/cls_rgw_client.h index 501d0379e2131..be7106a6c34f9 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -305,7 +305,7 @@ public: }; void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolute, - map& stats); + const map& stats); void cls_rgw_bucket_prepare_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag, const cls_rgw_obj_key& key, const string& locator, bool log_op, diff --git a/src/cls/rgw/cls_rgw_types.cc b/src/cls/rgw/cls_rgw_types.cc index 428dd11fbf973..27a413e865b94 100644 --- a/src/cls/rgw/cls_rgw_types.cc +++ b/src/cls/rgw/cls_rgw_types.cc @@ -237,8 +237,9 @@ void rgw_cls_bi_entry::dump(Formatter *f) const dump_bi_entry(data, type, f); } -void rgw_cls_bi_entry::get_key(cls_rgw_obj_key *key) +bool rgw_cls_bi_entry::get_info(cls_rgw_obj_key *key, uint8_t *category, rgw_bucket_category_stats *accounted_stats) { + bool account = false; bufferlist::iterator iter = data.begin(); switch (type) { case PlainIdx: @@ -247,6 +248,11 @@ void rgw_cls_bi_entry::get_key(cls_rgw_obj_key *key) rgw_bucket_dir_entry entry; ::decode(entry, iter); *key = entry.key; + *category = entry.meta.category; + accounted_stats->num_entries++; + accounted_stats->total_size += entry.meta.accounted_size; + accounted_stats->total_size_rounded += cls_rgw_get_rounded_size(entry.meta.accounted_size); + account = true; } break; case OLHIdx: @@ -259,6 +265,8 @@ void rgw_cls_bi_entry::get_key(cls_rgw_obj_key *key) default: break; } + + return account; } void rgw_bucket_olh_entry::dump(Formatter *f) const diff --git a/src/cls/rgw/cls_rgw_types.h b/src/cls/rgw/cls_rgw_types.h index 04383147e2412..ea14cb6ec23f4 100644 --- a/src/cls/rgw/cls_rgw_types.h +++ b/src/cls/rgw/cls_rgw_types.h @@ -49,6 +49,13 @@ enum RGWCheckMTimeType { CLS_RGW_CHECK_TIME_MTIME_GE = 4, }; +#define ROUND_BLOCK_SIZE 4096 + +static inline uint64_t cls_rgw_get_rounded_size(uint64_t size) +{ + return (size + ROUND_BLOCK_SIZE - 1) & ~(ROUND_BLOCK_SIZE - 1); +} + struct rgw_bucket_pending_info { RGWPendingState state; ceph::real_time timestamp; @@ -361,6 +368,8 @@ enum BIIndexType { OLHIdx = 3, }; +struct rgw_bucket_category_stats; + struct rgw_cls_bi_entry { BIIndexType type; string idx; @@ -389,7 +398,7 @@ struct rgw_cls_bi_entry { void dump(Formatter *f) const; void decode_json(JSONObj *obj, cls_rgw_obj_key *effective_key = NULL); - void get_key(cls_rgw_obj_key *key); + bool get_info(cls_rgw_obj_key *key, uint8_t *category, rgw_bucket_category_stats *accounted_stats); }; WRITE_CLASS_ENCODER(rgw_cls_bi_entry) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index bfa072f444a20..b46465ba0a228 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -15,6 +15,8 @@ #include "common/errno.h" #include "common/safe_io.h" +#include "cls/rgw/cls_rgw_client.h" + #include "global/global_init.h" #include "include/utime.h" @@ -2014,6 +2016,7 @@ class BucketReshardShard { int num_shard; RGWRados::BucketShard bs; vector entries; + map stats; public: BucketReshardShard(RGWRados *_store, RGWBucketInfo& _bucket_info, int _num_shard) : store(_store), bucket_info(_bucket_info), bs(store) { @@ -2021,8 +2024,15 @@ public: bs.init(bucket_info.bucket, num_shard); } - int add_entry(rgw_cls_bi_entry& entry) { + int add_entry(rgw_cls_bi_entry& entry, bool account, uint8_t category, + rgw_bucket_category_stats entry_stats) { entries.push_back(entry); + if (account) { + rgw_bucket_category_stats& target = stats[category]; + target.num_entries += entry_stats.num_entries; + target.total_size += entry_stats.total_size; + target.total_size_rounded += entry_stats.total_size_rounded; + } if (entries.size() >= RESHARD_SHARD_WINDOW) { int ret = flush(); if (ret < 0) { @@ -2040,12 +2050,14 @@ public: for (auto& entry : entries) { store->bi_put(op, bs, entry); } + cls_rgw_bucket_update_stats(op, false, stats); int ret = bs.index_ctx.operate(bs.bucket_obj, &op); if (ret < 0) { std::cerr << "ERROR: failed to store entries in target bucket shard (bs=" << bs.bucket << "/" << bs.shard_id << ") error=" << cpp_strerror(-ret) << std::endl; return ret; } entries.clear(); + stats.clear(); return 0; } }; @@ -4804,7 +4816,9 @@ next: int target_shard_id; cls_rgw_obj_key cls_key; - entry.get_key(&cls_key); + uint8_t category; + rgw_bucket_category_stats stats; + bool account = entry.get_info(&cls_key, &category, &stats); rgw_obj_key key(cls_key); rgw_obj obj(new_bucket_info.bucket, key); int ret = store->get_target_shard_id(new_bucket_info, obj.get_hash_object(), &target_shard_id); @@ -4815,7 +4829,7 @@ next: int shard_index = (target_shard_id > 0 ? target_shard_id : 0); - ret = target_shards[shard_index]->add_entry(entry); + ret = target_shards[shard_index]->add_entry(entry, account, category, stats); if (ret < 0) { cerr << "ERROR: target_shards.add_entry(" << key << ") returned error: " << cpp_strerror(-ret) << std::endl; return ret; -- 2.39.5