]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: don't send tail to gc if copying object to itself
authorYehuda Sadeh <yehuda@inktank.com>
Mon, 22 Apr 2013 19:48:56 +0000 (12:48 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 3 May 2013 19:47:51 +0000 (12:47 -0700)
Fixes: #4776
Backport: bobtail
Need to make sure that when copying an object into itself we don't
send the tail to the garbage collection.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
(cherry picked from commit de5d1da810732ee48f41e8be18257053d862301b)

src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 78d2e69f7d6d0c336a6f5c8d6bfad414b4721afa..31332b5993ec2daea8a94f01dfd762c3508b4f97 100644 (file)
@@ -1364,6 +1364,9 @@ int RGWRados::copy_obj(void *ctx,
   } else {
     pmanifest = &astate->manifest;
     tag = astate->obj_tag.c_str();
+
+    /* don't send the object's tail for garbage collection */
+    astate->keep_tail = true;
   }
 
   if (copy_first) {
@@ -1585,7 +1588,7 @@ int RGWRados::bucket_suspended(rgw_bucket& bucket, bool *suspended)
 
 int RGWRados::complete_atomic_overwrite(RGWRadosCtx *rctx, RGWObjState *state, rgw_obj& obj)
 {
-  if (!state || !state->has_manifest)
+  if (!state || !state->has_manifest || state->keep_tail)
     return 0;
 
   cls_rgw_obj_chain chain;
index 69a65bb1fb933d3b50fe113dcd39ea664de4f7eb..d1b106a07b5904973f8f80e4aeaab413124bafd0 100644 (file)
@@ -173,11 +173,12 @@ struct RGWObjState {
   bool has_data;
   bufferlist data;
   bool prefetch_data;
+  bool keep_tail;
 
   map<string, bufferlist> attrset;
   RGWObjState() : is_atomic(false), has_attrs(0), exists(false),
                   size(0), mtime(0), epoch(0), fake_tag(false), has_manifest(false),
-                  has_data(false), prefetch_data(false) {}
+                  has_data(false), prefetch_data(false), keep_tail(false) {}
 
   bool get_attr(string name, bufferlist& dest) {
     map<string, bufferlist>::iterator iter = attrset.find(name);