From 31f01da633bad327502558db59b7caf57d4fefe5 Mon Sep 17 00:00:00 2001 From: Marcus Watts Date: Thu, 23 Aug 2018 13:03:15 -0400 Subject: [PATCH] rgw: bucket link: simplify use of get bucket info. The bucket link command was doing an extra bucket get info call because it needed attributes. Revised ::init so that attributes could optionally be requested, and eliminate now unnecessary call. Fixes: http://tracker.ceph.com/issues/35885 Signed-off-by: Marcus Watts --- src/rgw/rgw_bucket.cc | 33 ++++++++++----------------------- src/rgw/rgw_bucket.h | 5 +++-- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 2f18b5d5a62..f4c664c9a6a 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -782,7 +782,7 @@ static void set_err_msg(std::string *sink, std::string msg) } int RGWBucket::init(RGWRados *storage, RGWBucketAdminOpState& op_state, - std::string *err_msg) + std::string *err_msg, map *pattrs) { std::string bucket_tenant; if (!storage) { @@ -810,8 +810,9 @@ int RGWBucket::init(RGWRados *storage, RGWBucketAdminOpState& op_state, } if (!bucket_name.empty()) { - int r = store->get_bucket_info(obj_ctx, tenant, bucket_name, bucket_info, NULL, null_yield); - + ceph::real_time mtime; + int r = store->get_bucket_info(obj_ctx, bucket_tenant, bucket_name, + bucket_info, &mtime, pattrs); if (r < 0) { set_err_msg(err_msg, "failed to fetch bucket info for bucket=" + bucket_name); ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket_name << dendl; @@ -835,7 +836,8 @@ int RGWBucket::init(RGWRados *storage, RGWBucketAdminOpState& op_state, return 0; } -int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) +int RGWBucket::link(RGWBucketAdminOpState& op_state, + map& attrs, std::string *err_msg) { if (!op_state.is_user_op()) { set_err_msg(err_msg, "empty user id"); @@ -843,12 +845,6 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) } string bucket_id = op_state.get_bucket_id(); -#if 0 - if (bucket_id.empty()) { - set_err_msg(err_msg, "empty bucket instance id"); - return -EINVAL; - } -#endif std::string display_name = op_state.get_user_display_name(); rgw_bucket bucket = op_state.get_bucket(); @@ -863,16 +859,6 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) rgw_raw_obj obj(root_pool, bucket_entry); RGWObjVersionTracker objv_tracker; - map attrs; - RGWBucketInfo bucket_info; - - auto obj_ctx = store->svc.sysobj->init_obj_ctx(); - int r = store->get_bucket_instance_info(obj_ctx, bucket, bucket_info, NULL, &attrs, null_yield); - if (r < 0) { - set_err_msg(err_msg, "failed to refetch bucket info"); - return r; - } - map::iterator aiter = attrs.find(RGW_ATTR_ACL); if (aiter != attrs.end()) { bufferlist aclbl = aiter->second; @@ -887,7 +873,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg) return -EIO; } - r = rgw_unlink_bucket(store, owner.get_id(), bucket.tenant, bucket.name, false); + int r = rgw_unlink_bucket(store, owner.get_id(), bucket.tenant, bucket.name, false); if (r < 0) { set_err_msg(err_msg, "could not unlink policy from user " + owner.get_id().to_str()); return r; @@ -1376,12 +1362,13 @@ int RGWBucketAdminOp::unlink(RGWRados *store, RGWBucketAdminOpState& op_state) int RGWBucketAdminOp::link(RGWRados *store, RGWBucketAdminOpState& op_state, string *err) { RGWBucket bucket; + map attrs; - int ret = bucket.init(store, op_state, err); + int ret = bucket.init(store, op_state, err, &attrs); if (ret < 0) return ret; - return bucket.link(op_state, err); + return bucket.link(op_state, attrs, err); } diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 086a4b6ebbd..e9528b9c3e6 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -317,7 +317,7 @@ class RGWBucket public: RGWBucket() : store(NULL), handle(NULL), failure(false) {} int init(RGWRados *storage, RGWBucketAdminOpState& op_state, - std::string *err_msg = NULL); + std::string *err_msg = NULL, map *pattrs = NULL); int check_bad_index_multipart(RGWBucketAdminOpState& op_state, RGWFormatterFlusher& flusher, std::string *err_msg = NULL); @@ -333,7 +333,8 @@ public: std::string *err_msg = NULL); int remove(RGWBucketAdminOpState& op_state, optional_yield y, bool bypass_gc = false, bool keep_index_consistent = true, std::string *err_msg = NULL); - int link(RGWBucketAdminOpState& op_state, std::string *err_msg = NULL); + int link(RGWBucketAdminOpState& op_state, map& attrs, + std::string *err_msg = NULL); int unlink(RGWBucketAdminOpState& op_state, std::string *err_msg = NULL); int set_quota(RGWBucketAdminOpState& op_state, std::string *err_msg = NULL); -- 2.39.5