From 100865d7a624c96c673a78adb6159bb2a47d9f6b Mon Sep 17 00:00:00 2001 From: Marcus Watts Date: Mon, 27 Aug 2018 19:30:28 -0400 Subject: [PATCH] rgw: bucket link: base "bucket move" (tenant id only) This is the base or primitive "bucket move" function. It handles rewriting the endpoint and info rados objects for the rgw bucket, plus deleting the original rados objects that are no longer correct. It doesn't handle changing the bucket name; that's in a future commit. Some of the changes here will get overwritten by that commit. Fixes: http://tracker.ceph.com/issues/35885 Signed-off-by: Marcus Watts --- src/rgw/rgw_bucket.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index cd93cbdbb205c..131864f0f4f07 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -874,6 +874,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, rgw_make_bucket_entry_name(tenant, bucket_name, bucket_entry); rgw_raw_obj obj(root_pool, bucket_entry); RGWObjVersionTracker objv_tracker; + RGWObjVersionTracker old_version = bucket_info.objv_tracker; map::iterator aiter = attrs.find(RGW_ATTR_ACL); if (aiter == attrs.end()) { @@ -933,7 +934,8 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, attrs[RGW_ATTR_ACL] = aclbl; bucket_info.bucket.tenant = tenant; bucket_info.owner = user_info.user_id; - r = store->put_bucket_instance_info(bucket_info, false, real_time(), &attrs); + bucket_info.objv_tracker.version_for_read()->ver = 0; + r = store->put_bucket_instance_info(bucket_info, true, real_time(), &attrs); if (r < 0) { set_err_msg(err_msg, "ERROR: failed writing bucket instance info: " + cpp_strerror(-r)); return r; @@ -961,7 +963,21 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, return r; } if (bucket != old_bucket) { - // howto remove old bucket ? + RGWObjVersionTracker ep_version; + *ep_version.version_for_read() = bucket_info.ep_objv; + // like RGWRados::delete_bucket -- excepting no bucket_index work. + r = rgw_bucket_delete_bucket_obj(store, old_bucket.tenant, old_bucket.name, ep_version); + if (r < 0) { + set_err_msg(err_msg, "failed to unlink old bucket endpoint"); + return r; + } + string entry = old_bucket.get_key(); + r = rgw_bucket_instance_remove_entry(store, entry, &old_version); + if (r < 0) { + set_err_msg(err_msg, "failed to unlink old bucket info"); + return r; + } + } return 0; -- 2.39.5