]> git-server-git.apps.pok.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>
Fri, 30 Sep 2016 17:16:37 +0000 (10:16 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
Conflicts:
src/cls/rgw/cls_rgw_types.h
src/rgw/rgw_admin.cc

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 7a5ff68fd243a525868eabeaebcbb4f85b05eeb7..57e09ece49d2e866c0f879f3de76d0a817823f71 100644 (file)
@@ -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;
index d22562b9e0347253a303cb4b39903473c6aad2ba..d9092ad3fe0dd79e273fec5f2535883852367824 100644 (file)
@@ -303,7 +303,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 dc0b6e291915e3dd9d3e1579d693840d146fc7ed..2c4a3da043f1b3245727b4f2998913595a53b1b6 100644 (file)
@@ -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
index 78edcaadefd6895da7fa3c6b08e249bc3afe60f1..7e7540f7682723915d00657a4542f87b3289b710 100644 (file)
@@ -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)
 
index 7049055426c34f42d1cb3ecc5bfe83663102bff4..331a0dffd4555ee41a672ab8635058a2a0a44cd9 100644 (file)
@@ -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<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) {
@@ -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;