]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
RGW - Zipper don't overwrite s->bucket
authorDaniel Gryniewicz <dang@redhat.com>
Tue, 31 Aug 2021 13:22:09 +0000 (09:22 -0400)
committerDaniel Gryniewicz <dang@redhat.com>
Fri, 17 Sep 2021 13:43:01 +0000 (09:43 -0400)
Undo an overwrite of s->bucket that was added as part of the zipper
work.  s->bucket should never be overwritten.

Signed-off-by: Daniel Gryniewicz <dang@redhat.com>
src/rgw/rgw_common.h
src/rgw/rgw_op.cc

index 3bacbaabda76e68cbbb8bf4956059f925c237c34..383c8074ccdc9c93fdbffd37d70cb3719781e189 100644 (file)
@@ -1538,6 +1538,8 @@ struct req_state : DoutPrefixProvider {
   std::string bucket_tenant;
   std::string bucket_name;
 
+  /* bucket is only created in rgw_build_bucket_policies() and should never be
+   * overwritten */
   std::unique_ptr<rgw::sal::Bucket> bucket;
   std::unique_ptr<rgw::sal::Object> object;
   std::string src_tenant_name;
index c5c7a51a62b1dbfeef0770632d372882359cd64c..502d70e2158d3c998ef8fce8db48c258c44e1446 100644 (file)
@@ -503,6 +503,8 @@ int rgw_build_bucket_policies(const DoutPrefixProvider *dpp, rgw::sal::Store* st
   if (!s->bucket_name.empty()) {
     s->bucket_exists = true;
 
+    /* This is the only place that s->bucket is created.  It should never be
+     * overwritten. */
     ret = store->get_bucket(dpp, s->user.get(), rgw_bucket(rgw_bucket_key(s->bucket_tenant, s->bucket_name, s->bucket_instance_id)), &s->bucket, y);
     if (ret < 0) {
       if (ret != -ENOENT) {
@@ -3190,19 +3192,24 @@ void RGWCreateBucket::execute(optional_yield y)
 
   /* we need to make sure we read bucket info, it's not read before for this
    * specific request */
-  op_ret = store->get_bucket(this, s->user.get(), s->bucket_tenant, s->bucket_name, &s->bucket, y);
-  if (op_ret < 0 && op_ret != -ENOENT)
-    return;
-  s->bucket_exists = (op_ret != -ENOENT);
-
-  if (s->bucket_exists) {
-    if (!s->system_request &&
-        store->get_zone()->get_zonegroup().get_id() != s->bucket->get_info().zonegroup) {
-      op_ret = -EEXIST;
+  {
+    std::unique_ptr<rgw::sal::Bucket> tmp_bucket;
+    op_ret = store->get_bucket(this, s->user.get(), s->bucket_tenant,
+                              s->bucket_name, &tmp_bucket, y);
+    if (op_ret < 0 && op_ret != -ENOENT)
       return;
+    s->bucket_exists = (op_ret != -ENOENT);
+
+    if (s->bucket_exists) {
+      if (!s->system_request &&
+         store->get_zone()->get_zonegroup().get_id() !=
+         tmp_bucket->get_info().zonegroup) {
+       op_ret = -EEXIST;
+       return;
+      }
+      /* Initialize info from req_state */
+      info = tmp_bucket->get_info();
     }
-    /* Initialize info from req_state */
-    info = s->bucket->get_info();
   }
 
   s->bucket_owner.set_id(s->user->get_id()); /* XXX dang use s->bucket->owner */