]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't overwrite bucket entry data when syncing user stats 1432/head
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 12 Mar 2014 01:19:44 +0000 (18:19 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 12 Mar 2014 01:19:44 +0000 (18:19 -0700)
Fixes: #7687
When syncing user bucket stats we overwritten the entire entry with the
passed in entry. We should only look at the stats portion, and not
overwrite the rest (which contains bucket creation time).

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/cls/user/cls_user.cc

index a72ba33604e7a0bd0b27b196affb5fb1401ac73f..003a8347889fcdd4b92367fb6040510990529451 100644 (file)
@@ -114,6 +114,13 @@ static void dec_header_stats(cls_user_stats *stats, cls_user_bucket_entry& entry
   stats->total_entries -= entry.count;
 }
 
+static void apply_entry_stats(const cls_user_bucket_entry& src_entry, cls_user_bucket_entry *target_entry)
+{
+  target_entry->size = src_entry.size;
+  target_entry->size_rounded = src_entry.size_rounded;
+  target_entry->count = src_entry.count;
+}
+
 static int cls_user_set_buckets_info(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
 {
   bufferlist::iterator in_iter = in->begin();
@@ -135,32 +142,35 @@ static int cls_user_set_buckets_info(cls_method_context_t hctx, bufferlist *in,
 
   for (list<cls_user_bucket_entry>::iterator iter = op.entries.begin();
        iter != op.entries.end(); ++iter) {
-    cls_user_bucket_entry& entry = *iter;
+    cls_user_bucket_entry& update_entry = *iter;
 
     string key;
 
-    get_key_by_bucket_name(entry.bucket.name, &key);
+    get_key_by_bucket_name(update_entry.bucket.name, &key);
 
-    cls_user_bucket_entry old_entry;
-    ret = get_existing_bucket_entry(hctx, key, old_entry);
+    cls_user_bucket_entry entry;
+    ret = get_existing_bucket_entry(hctx, key, entry);
 
     if (ret == -ENOENT) {
      if (!op.add)
       continue; /* racing bucket removal */
 
+     entry = update_entry;
+
      ret = 0;
     }
 
     if (ret < 0) {
       CLS_LOG(0, "ERROR: get_existing_bucket_entry() key=%s returned %d", key.c_str(), ret);
       return ret;
-    } else if (ret >= 0 && old_entry.user_stats_sync) {
-      dec_header_stats(&header.stats, old_entry);
+    } else if (ret >= 0 && entry.user_stats_sync) {
+      dec_header_stats(&header.stats, entry);
     }
 
     CLS_LOG(20, "storing entry for key=%s size=%lld count=%lld",
-            key.c_str(), (long long)entry.size, (long long)entry.count);
+            key.c_str(), (long long)update_entry.size, (long long)update_entry.count);
 
+    apply_entry_stats(update_entry, &entry);
     entry.user_stats_sync = true;
 
     ret = write_entry(hctx, key, entry);