]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw, cls_rgw: add accounted_size for object metadata entry
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 5 Aug 2014 17:24:54 +0000 (10:24 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 16 Jan 2015 22:18:44 +0000 (14:18 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/cls/rgw/cls_rgw.cc
src/cls/rgw/cls_rgw_types.cc
src/cls/rgw/cls_rgw_types.h
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index eb4a4232d1892f6a624d0fee2db41f064c5cee7d..16b38236f18e5245b83ca46a74d44fbbc08933f1 100644 (file)
@@ -300,8 +300,8 @@ 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.size;
-      stats.total_size_rounded += get_rounded_size(entry.meta.size);
+      stats.total_size += entry.meta.accounted_size;
+      stats.total_size_rounded += get_rounded_size(entry.meta.accounted_size);
 
       start_obj = kiter->first;
     }
@@ -494,8 +494,8 @@ 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.size;
-  stats.total_size_rounded -= get_rounded_size(entry.meta.size);
+  stats.total_size -= entry.meta.accounted_size;
+  stats.total_size_rounded -= get_rounded_size(entry.meta.accounted_size);
 }
 
 static int read_index_entry(cls_method_context_t hctx, string& name, struct rgw_bucket_dir_entry *entry)
@@ -637,8 +637,8 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist
       entry.exists = true;
       entry.tag = op.tag;
       stats.num_entries++;
-      stats.total_size += meta.size;
-      stats.total_size_rounded += get_rounded_size(meta.size);
+      stats.total_size += meta.accounted_size;
+      stats.total_size_rounded += get_rounded_size(meta.accounted_size);
       bufferlist new_key_bl;
       ::encode(entry, new_key_bl);
       int ret = cls_cxx_map_set_val(hctx, op.name, &new_key_bl);
@@ -757,8 +757,8 @@ int rgw_dir_suggest_changes(cls_method_context_t hctx, bufferlist *in, bufferlis
         struct rgw_bucket_category_stats& old_stats = header.stats[cur_disk.meta.category];
         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.size;
-        old_stats.total_size_rounded -= get_rounded_size(cur_disk.meta.size);
+        old_stats.total_size -= cur_disk.meta.accounted_size;
+        old_stats.total_size_rounded -= get_rounded_size(cur_disk.meta.accounted_size);
         header_changed = true;
       }
       struct rgw_bucket_category_stats& stats =
@@ -773,8 +773,8 @@ int rgw_dir_suggest_changes(cls_method_context_t hctx, bufferlist *in, bufferlis
       case CEPH_RGW_UPDATE:
         CLS_LOG(10, "CEPH_RGW_UPDATE name=%s total_entries: %" PRId64 " -> %" PRId64 "\n", cur_change.name.c_str(), stats.num_entries, stats.num_entries + 1);
         stats.num_entries++;
-        stats.total_size += cur_change.meta.size;
-        stats.total_size_rounded += get_rounded_size(cur_change.meta.size);
+        stats.total_size += cur_change.meta.accounted_size;
+        stats.total_size_rounded += get_rounded_size(cur_change.meta.accounted_size);
         header_changed = true;
         cur_change.index_ver = header.ver;
         bufferlist cur_state_bl;
index f1c50bec546f07d0a55481ce2434900180558995..d6cb773b88397cf23f23da47ffec7763b4fa23f7 100644 (file)
@@ -41,6 +41,7 @@ void rgw_bucket_dir_entry_meta::dump(Formatter *f) const
   f->dump_string("owner", owner);
   f->dump_string("owner_display_name", owner_display_name);
   f->dump_string("content_type", content_type);
+  f->dump_unsigned("accounted_size", accounted_size);
 }
 
 void rgw_bucket_dir_entry::generate_test_instances(list<rgw_bucket_dir_entry*>& o)
index 1ed56ba0da89556c6b797a648c7ec9c7853fb0d7..a81bd943b9fb542359c024e94e55a214ee4628d6 100644 (file)
@@ -64,12 +64,13 @@ struct rgw_bucket_dir_entry_meta {
   string owner;
   string owner_display_name;
   string content_type;
+  uint64_t accounted_size;
 
   rgw_bucket_dir_entry_meta() :
-  category(0), size(0) { mtime.set_from_double(0); }
+  category(0), size(0), accounted_size(0) { mtime.set_from_double(0); }
 
   void encode(bufferlist &bl) const {
-    ENCODE_START(3, 3, bl);
+    ENCODE_START(4, 3, bl);
     ::encode(category, bl);
     ::encode(size, bl);
     ::encode(mtime, bl);
@@ -77,10 +78,11 @@ struct rgw_bucket_dir_entry_meta {
     ::encode(owner, bl);
     ::encode(owner_display_name, bl);
     ::encode(content_type, bl);
+    ::encode(accounted_size, bl);
     ENCODE_FINISH(bl);
   }
   void decode(bufferlist::iterator &bl) {
-    DECODE_START_LEGACY_COMPAT_LEN(3, 3, 3, bl);
+    DECODE_START_LEGACY_COMPAT_LEN(4, 3, 3, bl);
     ::decode(category, bl);
     ::decode(size, bl);
     ::decode(mtime, bl);
@@ -89,6 +91,10 @@ struct rgw_bucket_dir_entry_meta {
     ::decode(owner_display_name, bl);
     if (struct_v >= 2)
       ::decode(content_type, bl);
+    if (struct_v >= 4)
+      ::decode(accounted_size, bl);
+    else
+      accounted_size = size;
     DECODE_FINISH(bl);
   }
   void dump(Formatter *f) const;
index 5dd6632a021f42970559edafa4fe99416d966a07..a68fb5a67badafbd568fdbab4c06c1d7f93c9fd7 100644 (file)
@@ -1452,7 +1452,7 @@ protected:
 public:
   bool immutable_head() { return true; }
   RGWPutObjProcessor_Multipart(const string& bucket_owner, uint64_t _p, req_state *_s) :
-                   RGWPutObjProcessor_Atomic(bucket_owner, _s->bucket, _s->object_str, _p, _s->req_id), s(_s) {}
+                   RGWPutObjProcessor_Atomic(bucket_owner, _s->bucket, _s->object_str, _p, _s->req_id, false), s(_s) {}
 };
 
 int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, void *obj_ctx, string *oid_rand)
@@ -1580,7 +1580,7 @@ RGWPutObjProcessor *RGWPutObj::select_processor(bool *is_multipart)
   const string& bucket_owner = s->bucket_owner.get_id();
 
   if (!multipart) {
-    processor = new RGWPutObjProcessor_Atomic(bucket_owner, s->bucket, s->object_str, part_size, s->req_id);
+    processor = new RGWPutObjProcessor_Atomic(bucket_owner, s->bucket, s->object_str, part_size, s->req_id, s->bucket_info.versioning_enabled);
   } else {
     processor = new RGWPutObjProcessor_Multipart(bucket_owner, part_size, s);
   }
@@ -1827,7 +1827,7 @@ RGWPutObjProcessor *RGWPostObj::select_processor()
 
   uint64_t part_size = s->cct->_conf->rgw_obj_stripe_size;
 
-  processor = new RGWPutObjProcessor_Atomic(s->bucket_owner.get_id(), s->bucket, s->object_str, part_size, s->req_id);
+  processor = new RGWPutObjProcessor_Atomic(s->bucket_owner.get_id(), s->bucket, s->object_str, part_size, s->req_id, s->bucket_info.versioning_enabled);
 
   return processor;
 }
index bb110142f49128c275be17a64bee4c6fffc8e6a1..90187a7bf3eeb6d43b7eff1226d9bd624e155b42 100644 (file)
@@ -1215,6 +1215,17 @@ int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, time_t s
   extra_params.set_mtime = set_mtime;
   extra_params.owner = bucket_owner;
 
+  if (versioned_object) {
+    rgw_obj ver_head_obj(head_obj.bucket, head_obj.object, "ver");
+
+    r = store->put_obj_meta(NULL, ver_head_obj, obj_len, attrs,
+                            RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE,
+                            extra_params);
+    if (r < 0) {
+      return r;
+    }
+  }
+
   r = store->put_obj_meta(obj_ctx, head_obj, obj_len, attrs,
                           RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE,
                           extra_params);
@@ -3277,7 +3288,7 @@ int RGWRados::copy_obj(void *ctx,
     append_rand_alpha(cct, tag, tag, 32);
 
     RGWPutObjProcessor_Atomic processor(dest_bucket_info.owner, dest_obj.bucket, dest_obj.object,
-                                        cct->_conf->rgw_obj_stripe_size, tag);
+                                        cct->_conf->rgw_obj_stripe_size, tag, dest_bucket_info.versioning_enabled);
     ret = processor.prepare(this, ctx, NULL);
     if (ret < 0)
       return ret;
@@ -6079,6 +6090,7 @@ int RGWRados::cls_obj_complete_op(rgw_bucket& bucket, RGWModifyOp op, string& ta
   ObjectWriteOperation o;
   rgw_bucket_dir_entry_meta dir_meta;
   dir_meta.size = ent.size;
+  dir_meta.accounted_size = ent.size;
   dir_meta.mtime = utime_t(ent.mtime, 0);
   dir_meta.etag = ent.etag;
   dir_meta.owner = ent.owner;
index 57338b860163045603f2c65529339dd067b60f01..c8de6ccdcbdb4d5a7850fd38a2235ffd81afee3a 100644 (file)
@@ -644,6 +644,8 @@ class RGWPutObjProcessor_Atomic : public RGWPutObjProcessor_Aio
   bufferlist pending_data_bl;
   uint64_t max_chunk_size;
 
+  bool versioned_object;
+
 protected:
   rgw_bucket bucket;
   string obj_str;
@@ -668,7 +670,7 @@ protected:
 
 public:
   ~RGWPutObjProcessor_Atomic() {}
-  RGWPutObjProcessor_Atomic(const string& bucket_owner, rgw_bucket& _b, const string& _o, uint64_t _p, const string& _t) :
+  RGWPutObjProcessor_Atomic(const string& bucket_owner, rgw_bucket& _b, const string& _o, uint64_t _p, const string& _t, bool versioned) :
                                 RGWPutObjProcessor_Aio(bucket_owner),
                                 part_size(_p),
                                 cur_part_ofs(0),
@@ -677,6 +679,7 @@ public:
                                 data_ofs(0),
                                 extra_data_len(0),
                                 max_chunk_size(0),
+                                versioned_object(versioned),
                                 bucket(_b),
                                 obj_str(_o),
                                 unique_tag(_t) {}