]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix version tracking across bucket link steps 29851/head
authorMatt Benjamin <mbenjamin@redhat.com>
Fri, 23 Aug 2019 14:26:02 +0000 (10:26 -0400)
committerMatt Benjamin <mbenjamin@redhat.com>
Thu, 12 Dec 2019 19:06:50 +0000 (14:06 -0500)
Fixes: https://tracker.ceph.com/issues/41410
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h

index 1a3b6b1a4c5562dd67c8ed7cd6fbcc7c04364501..958eaa82f21d7171a81e084689af612184b6fccf 100644 (file)
@@ -154,7 +154,6 @@ int rgw_read_user_buckets(rgw::sal::RGWRadosStore * store,
                           bool need_stats)
 {
   rgw::sal::RGWRadosUser user(store, user_id);
-
   return user.list_buckets(marker, end_marker, max, need_stats, buckets);
 }
 
@@ -737,7 +736,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, optional_yield y,
     // like RGWRados::delete_bucket -- excepting no bucket_index work.
     r = bucket_ctl->remove_bucket_entrypoint_info(old_bucket, y,
                                                   RGWBucketCtl::Bucket::RemoveParams()
-                                                  .set_objv_tracker(&ep_objv));
+                                                  .set_objv_tracker(&ep_data.ep_objv));
     if (r < 0) {
       set_err_msg(err_msg, "failed to unlink old bucket endpoint " + old_bucket.tenant + "/" + old_bucket.name);
       return r;
@@ -3401,9 +3400,8 @@ int RGWBucketCtl::do_link_bucket(RGWSI_Bucket_EP_Ctx& ctx,
 
   RGWBucketEntryPoint ep;
   RGWObjVersionTracker ot;
-
+  RGWObjVersionTracker& rot = (pinfo) ? pinfo->ep_objv : ot;
   map<string, bufferlist> attrs, *pattrs = nullptr;
-
   string meta_key;
 
   if (update_entrypoint) {
@@ -3414,7 +3412,7 @@ int RGWBucketCtl::do_link_bucket(RGWSI_Bucket_EP_Ctx& ctx,
     } else {
       ret = svc.bucket->read_bucket_entrypoint_info(ctx,
                                                     meta_key,
-                                                    &ep, &ot,
+                                                    &ep, &rot,
                                                     nullptr, &attrs,
                                                     y);
       if (ret < 0 && ret != -ENOENT) {
@@ -3427,8 +3425,11 @@ int RGWBucketCtl::do_link_bucket(RGWSI_Bucket_EP_Ctx& ctx,
 
   ret = ctl.user->add_bucket(user_id, bucket, creation_time);
   if (ret < 0) {
-    ldout(cct, 0) << "ERROR: error adding bucket to user directory: user=" << user_id
-                  << " bucket=" << bucket << " err=" << cpp_strerror(-ret) << dendl;
+    ldout(cct, 0) << "ERROR: error adding bucket to user directory:"
+                 << " user=" << user_id
+                  << " bucket=" << bucket
+                 << " err=" << cpp_strerror(-ret)
+                 << dendl;
     goto done_err;
   }
 
@@ -3438,12 +3439,13 @@ int RGWBucketCtl::do_link_bucket(RGWSI_Bucket_EP_Ctx& ctx,
   ep.linked = true;
   ep.owner = user_id;
   ep.bucket = bucket;
-  ret = svc.bucket->store_bucket_entrypoint_info(ctx, meta_key, ep, false,
-                                                 real_time(), pattrs, &ot, y);
+  ret = svc.bucket->store_bucket_entrypoint_info(
+    ctx, meta_key, ep, false, real_time(), pattrs, &rot, y);
   if (ret < 0)
     goto done_err;
 
   return 0;
+
 done_err:
   int r = do_unlink_bucket(ctx, user_id, bucket, y, true);
   if (r < 0) {
index 8e382848a1fcf52b3108325d3ea8a0cbc1cca016..6cdd276727b070a298468453b2a6b16e3bcd48d2 100644 (file)
@@ -567,10 +567,11 @@ public:
 };
 
 struct rgw_ep_info {
-    RGWBucketEntryPoint &ep;
-    map<string, bufferlist>& attrs;
-    rgw_ep_info(RGWBucketEntryPoint &ep, map<string, bufferlist>& attrs)
-       : ep(ep), attrs(attrs) { }
+  RGWBucketEntryPoint &ep;
+  map<std::string, buffer::list>& attrs;
+  RGWObjVersionTracker ep_objv;
+  rgw_ep_info(RGWBucketEntryPoint &ep, map<string, bufferlist>& attrs)
+    : ep(ep), attrs(attrs) {}
 };
 
 class RGWBucketCtl