From ef974b60864e3d9d37c9b1bfd40b86092914696b Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Tue, 31 Aug 2021 09:22:09 -0400 Subject: [PATCH] RGW - Zipper don't overwrite s->bucket 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 --- src/rgw/rgw_common.h | 2 ++ src/rgw/rgw_op.cc | 29 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 3bacbaabda76e..383c8074ccdc9 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -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 bucket; std::unique_ptr object; std::string src_tenant_name; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index c5c7a51a62b1d..502d70e2158d3 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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 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 */ -- 2.39.5