]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: forwards to master and uses gw_bucket_set_attrs
authorChang Liu <liuchang0812@gmail.com>
Wed, 8 May 2019 13:24:43 +0000 (21:24 +0800)
committerChang Liu <liuchang0812@gmail.com>
Tue, 4 Jun 2019 02:36:31 +0000 (10:36 +0800)
Signed-off-by: Chang Liu <liuchang0812@gmail.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_s3.cc

index 927f836a7adb74ce86a1d353f114e303b4334420..aede5202bd6cc9e4cf62c0ad66163d7c9e3b363f 100644 (file)
@@ -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<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()
@@ -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<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()
index 6a3c78e8bf6069912164ea36b818381394527386..49ed254a4ff6f21542eb48cc057c98ea39de88c6 100644 (file)
@@ -436,6 +436,7 @@ public:
 class RGWPutBucketTags : public RGWOp {
 protected:
   bufferlist tags_bl;
+  bufferlist in_data;
 public:
   int verify_permission() override;
   void execute() override;
index 40a23cdc4ae761626464cb6b19af533c6e70ee8f..807ffb227aa63464a78d7f878136ad18fef9d0cf 100644 (file)
@@ -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<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)
index d0fb69135dc944a18f1cb59c2bcd873ee5aa51cf..4ef1791a6cb13a323c059adbc2026f800fa53e46 100644 (file)
@@ -2003,9 +2003,6 @@ public:
   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,
index dc9a7866b35d7be2e2f4b3f9bfd7bf06e04e21e5..15444fb3b1a05d8143b9348ec9a39313108a84ef 100644 (file)
@@ -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()