From b908e45c024d96ff973d9eddd8a96bcddc5583bf Mon Sep 17 00:00:00 2001 From: Marcus Watts Date: Fri, 7 Sep 2018 21:26:46 -0400 Subject: [PATCH] rgw: bucket link: "bucket move"; handle bucket names too. This is the remainder of bucket move function. Implement bucket "rename" - use string passed in via '--bucket-new-name' to optinally override the resultant bucket name when doing bucket link. This is basically a slight generalization of changing the tenant of a bucket; the same operations are required for either. Further refinements included here are minor improvements to associated error messages. This does not change any "tail placement" information in any objects contained in the bucket. The bucket name is encoded there, along with the bucket id, but neither appears to be used, and the existing reshard logic which changes bucket ids also does not appear to alter that. Fixes: http://tracker.ceph.com/issues/35885 Signed-off-by: Marcus Watts --- src/rgw/rgw_bucket.cc | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 131864f0f4f07..9a054f38edb51 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -860,26 +860,31 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, string bucket_id = op_state.get_bucket_id(); std::string display_name = op_state.get_user_display_name(); - rgw_bucket bucket = op_state.get_bucket(); + rgw_bucket& bucket = op_state.get_bucket(); if (!bucket_id.empty() && bucket_id != bucket.bucket_id) { - set_err_msg(err_msg, "specified bucket id does not match"); + set_err_msg(err_msg, + "specified bucket id does not match " + bucket.bucket_id); return -EINVAL; } rgw_bucket old_bucket = bucket; bucket.tenant = tenant; + if (!op_state.new_bucket_name.empty()) { + auto pos = op_state.new_bucket_name.find('/'); + if (pos != boost::string_ref::npos) { + bucket.tenant = op_state.new_bucket_name.substr(0, pos); + bucket.name = op_state.new_bucket_name.substr(pos + 1); + } else { + bucket.name = op_state.new_bucket_name; + } + } - - const rgw_pool& root_pool = store->svc.zone->get_zone_params().domain_root; - std::string bucket_entry; - 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()) { // XXX why isn't this an error? mdw 20180825 - ldout(store->ctx(), 0) << "WARNING: bucket link will do nothing because no acl on bucket=" << bucket_name << dendl; + ldout(store->ctx(), 0) << "WARNING: bucket link will do nothing because no acl on bucket=" << old_bucket.name << dendl; return 0; } bufferlist aclbl = aiter->second; @@ -932,7 +937,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, } } else { attrs[RGW_ATTR_ACL] = aclbl; - bucket_info.bucket.tenant = tenant; + bucket_info.bucket = bucket; bucket_info.owner = user_info.user_id; bucket_info.objv_tracker.version_for_read()->ver = 0; r = store->put_bucket_instance_info(bucket_info, true, real_time(), &attrs); @@ -966,15 +971,16 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, 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); + 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"); + set_err_msg(err_msg, "failed to unlink old bucket endpoint " + old_bucket.tenant + "/" + old_bucket.name); 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"); + set_err_msg(err_msg, "failed to unlink old bucket info " + entry); return r; } -- 2.39.5