From: Yehuda Sadeh Date: Thu, 28 Nov 2019 02:11:47 +0000 (-0800) Subject: rgw: implement s3 delete bucket replication api X-Git-Tag: v15.1.0~22^2~31 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c1199c101eda128776523ccbac646b81b3efcc9e;p=ceph.git rgw: implement s3 delete bucket replication api Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index cbaf67d60adc..207cc3e4b529 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1263,8 +1263,6 @@ void RGWPutBucketReplication::execute() { 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; - } - if (op_ret < 0) { return; } } @@ -1278,8 +1276,57 @@ void RGWPutBucketReplication::execute() { s->bucket_info.set_sync_policy(std::move(sync_policy)); - return store->getRados()->put_bucket_instance_info(s->bucket_info, false, real_time(), - &s->bucket_attrs); + int ret = store->getRados()->put_bucket_instance_info(s->bucket_info, false, real_time(), + &s->bucket_attrs); + if (ret < 0) { + ldpp_dout(this, 0) << "ERROR: put_bucket_instance_info (bucket=" << s->bucket_info.bucket.get_key() << ") returned ret=" << ret << dendl; + return ret; + } + + return 0; + }); +} + +void RGWDeleteBucketReplication::pre_exec() +{ + rgw_bucket_object_pre_exec(s); +} + +int RGWDeleteBucketReplication::verify_permission() +{ + return verify_bucket_owner_or_policy(s, rgw::IAM::s3PutBucketTagging); +} + +void RGWDeleteBucketReplication::execute() +{ + 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->getRados(), s, [this] { + if (!s->bucket_info.sync_policy) { + return 0; + } + + rgw_sync_policy_info sync_policy = *s->bucket_info.sync_policy; + + update_sync_policy(&sync_policy); + + s->bucket_info.set_sync_policy(std::move(sync_policy)); + + int ret = store->getRados()->put_bucket_instance_info(s->bucket_info, false, real_time(), + &s->bucket_attrs); + if (ret < 0) { + ldpp_dout(this, 0) << "ERROR: put_bucket_instance_info (bucket=" << s->bucket_info.bucket.get_key() << ") returned ret=" << ret << dendl; + return ret; + } + + return 0; }); } diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e5ed28ea0ab2..50c9b772b24d 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -483,6 +483,19 @@ public: RGWOpType get_type() override { return RGW_OP_PUT_BUCKET_REPLICATION; } }; +class RGWDeleteBucketReplication : public RGWOp { +protected: + virtual void update_sync_policy(rgw_sync_policy_info *policy) = 0; +public: + void pre_exec() override; + int verify_permission() override; + void execute() override; + + const char* name() const override { return "delete_bucket_replication"; } + virtual uint32_t op_mask() override { return RGW_OP_TYPE_DELETE; } + RGWOpType get_type() override { return RGW_OP_DELETE_BUCKET_REPLICATION;} +}; + class RGWBulkDelete : public RGWOp { public: struct acct_path_t { diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index c0aa96a86b86..1b315c7c76c4 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -200,6 +200,12 @@ public: virtual ~RGWPutBucketReplication_ObjStore() = default; }; +class RGWDeleteBucketReplication_ObjStore: public RGWDeleteBucketReplication { +public: + RGWDeleteBucketReplication_ObjStore() = default; + virtual ~RGWDeleteBucketReplication_ObjStore() = default; +}; + class RGWListBuckets_ObjStore : public RGWListBuckets { public: RGWListBuckets_ObjStore() {} diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 952409dc09c0..40f2aff2b54e 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -593,6 +593,15 @@ void RGWPutBucketTags_ObjStore_S3::send_response() dump_start(s); } +void RGWDeleteBucketTags_ObjStore_S3::send_response() +{ + if (op_ret) + set_req_state_err(s, op_ret); + dump_errno(s); + end_header(s, this, "application/xml"); + dump_start(s); +} + namespace { bool is_valid_status(const string& s) { @@ -960,7 +969,13 @@ void RGWPutBucketReplication_ObjStore_S3::send_response() dump_start(s); } -void RGWDeleteBucketTags_ObjStore_S3::send_response() +void RGWDeleteBucketReplication_ObjStore_S3::update_sync_policy(rgw_sync_policy_info *policy) +{ + policy->groups.erase(enabled_group_id); + policy->groups.erase(disabled_group_id); +} + +void RGWDeleteBucketReplication_ObjStore_S3::send_response() { if (op_ret) set_req_state_err(s, op_ret); @@ -4135,7 +4150,7 @@ RGWOp *RGWHandler_REST_Bucket_S3::op_delete() } else if (is_notification_op()) { return RGWHandler_REST_PSNotifs_S3::create_delete_op(); } else if (is_replication_op()) { - return nullptr; // new RGWDeleteBucketReplication_ObjStore_S3; + return new RGWDeleteBucketReplication_ObjStore_S3; } if (s->info.args.sub_resource_exists("website")) { diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index 104f08faafa7..a301f24e1fd6 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -108,6 +108,14 @@ public: void send_response() override; }; +class RGWDeleteBucketReplication_ObjStore_S3 : public RGWDeleteBucketReplication_ObjStore +{ +protected: + void update_sync_policy(rgw_sync_policy_info *policy) override; +public: + void send_response() override; +}; + class RGWListBuckets_ObjStore_S3 : public RGWListBuckets_ObjStore { public: RGWListBuckets_ObjStore_S3() {}