}
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() {
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<string, bufferlist> 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()
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<string, bufferlist> 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()
class RGWPutBucketTags : public RGWOp {
protected:
bufferlist tags_bl;
+ bufferlist in_data;
public:
int verify_permission() override;
void execute() override;
return 0;
}
-int RGWRados::set_bucket_tags(rgw_bucket& bucket, bufferlist tags_bl)
-{
- RGWBucketInfo info;
- map<string, bufferlist> 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<string, bufferlist> 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)
int set_buckets_enabled(std::vector<rgw_bucket>& 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,
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()