]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: bucket reshard updates stats
authorYehuda Sadeh <yehuda@redhat.com>
Mon, 26 Sep 2016 17:45:17 +0000 (10:45 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Wed, 19 Oct 2016 15:41:48 +0000 (08:41 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/cls/rgw/cls_rgw.cc
src/cls/rgw/cls_rgw_client.h
src/cls/rgw/cls_rgw_types.cc
src/cls/rgw/cls_rgw_types.h
src/rgw/rgw_admin.cc

index fbdd70df031e7c2c5d6df3045b5d3c53d1e3bfbd..3da8a4436818867706032f2b1514e3025607f716 100644 (file)
@@ -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;
index 501d0379e213136a0294f1d729448f76fb3c5ba5..be7106a6c34f9658dee0bd2cc4e9864dd884b836 100644 (file)
@@ -305,7 +305,7 @@ public:
 };
 
 void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolute,
-                                 map<uint8_t, rgw_bucket_category_stats>& stats);
+                                 const map<uint8_t, rgw_bucket_category_stats>& 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,
index 428dd11fbf97364b3f63757facda74a53c0de3ff..27a413e865b948a555f098cf6a4eeba0cab33533 100644 (file)
@@ -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
index 04383147e2412f9849449444eb5c7c9864362ed2..ea14cb6ec23f4d659e0083d0eb24f6811e3f1021 100644 (file)
@@ -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)
 
index bfa072f444a20d8ffdeab4dee9a634216a9911ea..b46465ba0a22849ca1d1a2e45fdb55171e63b9ae 100644 (file)
@@ -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<rgw_cls_bi_entry> entries;
+  map<uint8_t, rgw_bucket_category_stats> 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;