From 8103ca3b348d7dc281a21539e8878870ef688df4 Mon Sep 17 00:00:00 2001 From: Chang Liu Date: Wed, 8 May 2019 21:24:43 +0800 Subject: [PATCH] rgw: forwards to master and uses gw_bucket_set_attrs Signed-off-by: Chang Liu --- src/rgw/rgw_op.cc | 48 ++++++++++++++++++++++++++++++------------ src/rgw/rgw_op.h | 1 + src/rgw/rgw_rados.cc | 44 -------------------------------------- src/rgw/rgw_rados.h | 3 --- src/rgw/rgw_rest_s3.cc | 8 ++++++- 5 files changed, 43 insertions(+), 61 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 927f836a7ad..aede5202bd6 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1171,12 +1171,7 @@ void RGWGetBucketTags::execute() } int RGWPutBucketTags::verify_permission() { - - if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketTagging)) { - return -EACCES; - } - - return 0; + return verify_bucket_owner_or_policy(s, rgw::IAM::s3PutBucketTagging); } void RGWPutBucketTags::execute() { @@ -1185,7 +1180,19 @@ void RGWPutBucketTags::execute() { if (op_ret < 0) return; - op_ret = store->set_bucket_tags(s->bucket, tags_bl); + if (!store->svc.zone->is_meta_master()) { + op_ret = forward_request_to_master(s, nullptr, store, in_data, nullptr); + if (op_ret < 0) { + ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; + } + } + + op_ret = retry_raced_bucket_write(store, s, [this] { + map attrs = s->bucket_attrs; + attrs[RGW_ATTR_TAGS] = tags_bl; + return rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker); + }); + } void RGWDeleteBucketTags::pre_exec() @@ -1195,16 +1202,31 @@ void RGWDeleteBucketTags::pre_exec() int RGWDeleteBucketTags::verify_permission() { - if (!verify_bucket_permission(this, s, rgw::IAM::s3PutBucketTagging)) { - return -EACCES; - } - - return 0; + return verify_bucket_owner_or_policy(s, rgw::IAM::s3PutBucketTagging); } void RGWDeleteBucketTags::execute() { - op_ret = store->delete_bucket_tags(s->bucket); + if (!store->svc.zone->is_meta_master()) { + bufferlist in_data; + op_ret = forward_request_to_master(s, nullptr, store, in_data, nullptr); + if (op_ret < 0) { + ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; + return; + } + } + + op_ret = retry_raced_bucket_write(store, s, [this] { + map attrs = s->bucket_attrs; + attrs.erase(RGW_ATTR_TAGS); + op_ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker); + if (op_ret < 0) { + ldpp_dout(this, 0) << "RGWDeleteBucketTags() failed to remove RGW_ATTR_TAGS on bucket=" + << s->bucket.name + << " returned err= " << op_ret << dendl; + } + return op_ret; + }); } int RGWOp::do_aws4_auth_completion() diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 6a3c78e8bf6..49ed254a4ff 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -436,6 +436,7 @@ public: class RGWPutBucketTags : public RGWOp { protected: bufferlist tags_bl; + bufferlist in_data; public: int verify_permission() override; void execute() override; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 40a23cdc4ae..807ffb227aa 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -5122,50 +5122,6 @@ int RGWRados::bucket_suspended(rgw_bucket& bucket, bool *suspended) return 0; } -int RGWRados::set_bucket_tags(rgw_bucket& bucket, bufferlist tags_bl) -{ - RGWBucketInfo info; - map attrs; - auto obj_ctx = svc.sysobj->init_obj_ctx(); - int r; - if (bucket.bucket_id.empty()) { - r = get_bucket_info(obj_ctx, bucket.tenant, bucket.name, info, NULL, &attrs); - } else { - r = get_bucket_instance_info(obj_ctx, bucket, info, nullptr, &attrs); - } - - attrs[RGW_ATTR_TAGS] = tags_bl; - - r = put_bucket_instance_info(info, false, real_time(), &attrs); - if (r < 0) { - ldout(cct, 0) << "NOTICE: put_bucket_tags on bucket=" << bucket.name << " returned err=" << r << dendl; - return r; - } - return 0; -} - -int RGWRados::delete_bucket_tags(rgw_bucket& bucket) -{ - RGWBucketInfo info; - map attrs; - auto obj_ctx = svc.sysobj->init_obj_ctx(); - int r; - if (bucket.bucket_id.empty()) { - r = get_bucket_info(obj_ctx, bucket.tenant, bucket.name, info, NULL, &attrs); - } else { - r = get_bucket_instance_info(obj_ctx, bucket, info, nullptr, &attrs); - } - - attrs.erase(RGW_ATTR_TAGS); - - r = put_bucket_instance_info(info, false, real_time(), &attrs); - if (r < 0) { - ldout(cct, 0) << "NOTICE: delete_bucket_tags on bucket=" << bucket.name << " returned err=" << r << dendl; - return r; - } - return 0; -} - int RGWRados::Object::complete_atomic_modification() { if (!state->has_manifest || state->keep_tail) diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index d0fb69135dc..4ef1791a6cb 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2003,9 +2003,6 @@ public: int set_buckets_enabled(std::vector& buckets, bool enabled); int bucket_suspended(rgw_bucket& bucket, bool *suspended); - int set_bucket_tags(rgw_bucket& bucket, bufferlist tags_bl); - int delete_bucket_tags(rgw_bucket& bucket); - /** Delete an object.*/ int delete_obj(RGWObjectCtx& obj_ctx, const RGWBucketInfo& bucket_owner, diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index dc9a7866b35..15444fb3b1a 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -542,7 +542,13 @@ int RGWPutBucketTags_ObjStore_S3::get_params() obj_tags.encode(tags_bl); ldout(s->cct, 20) << "Read " << obj_tags.count() << "tags" << dendl; - return 0; + // forward bucket cors requests to meta master zone + if (!store->svc.zone->is_meta_master()) { + /* only need to keep this data around if we're not meta master */ + in_data.append(data.c_str(), data.length()); + } + + return 0; } void RGWPutBucketTags_ObjStore_S3::send_response() -- 2.39.5