From: Yehuda Sadeh Date: Mon, 26 Sep 2016 17:45:17 +0000 (-0700) Subject: rgw: bucket reshard updates stats X-Git-Tag: v0.94.10~8^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a68d56febde154b3b92d3178d2e877e86b3e2dd9;p=ceph.git rgw: bucket reshard updates stats Signed-off-by: Yehuda Sadeh Conflicts: src/cls/rgw/cls_rgw_types.h src/rgw/rgw_admin.cc --- diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index 7a5ff68fd24..57e09ece49d 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -50,9 +50,6 @@ cls_method_handle_t h_rgw_gc_list; cls_method_handle_t h_rgw_gc_remove; -#define ROUND_BLOCK_SIZE 4096 - - #define BI_PREFIX_CHAR 0x80 #define BI_BUCKET_OBJS_INDEX 0 @@ -70,11 +67,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); } @@ -531,7 +523,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; } @@ -736,7 +728,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) @@ -920,7 +912,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); @@ -1927,7 +1919,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 = @@ -1944,7 +1936,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 d22562b9e03..d9092ad3fe0 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -303,7 +303,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 dc0b6e29191..2c4a3da043f 100644 --- a/src/cls/rgw/cls_rgw_types.cc +++ b/src/cls/rgw/cls_rgw_types.cc @@ -232,8 +232,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: @@ -242,6 +243,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: @@ -254,6 +260,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 78edcaadefd..7e7540f7682 100644 --- a/src/cls/rgw/cls_rgw_types.h +++ b/src/cls/rgw/cls_rgw_types.h @@ -36,6 +36,13 @@ enum RGWBILogFlags { RGW_BILOG_FLAG_VERSIONED_OP = 0x1, }; +#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; utime_t timestamp; @@ -348,6 +355,8 @@ enum BIIndexType { OLHIdx = 3, }; +struct rgw_bucket_category_stats; + struct rgw_cls_bi_entry { BIIndexType type; string idx; @@ -376,7 +385,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 7049055426c..331a0dffd45 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -16,6 +16,8 @@ using namespace std; #include "common/Formatter.h" #include "common/errno.h" +#include "cls/rgw/cls_rgw_client.h" + #include "global/global_init.h" #include "include/utime.h" @@ -1092,6 +1094,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) { @@ -1099,8 +1102,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) { @@ -1119,12 +1129,14 @@ public: rgw_cls_bi_entry& entry = *iter; 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; } }; @@ -2613,7 +2625,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); @@ -2624,7 +2638,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;