From 6a4d84866105314b93c6bb57045d6a5e8d3a45b9 Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Thu, 23 Jul 2020 12:38:11 -0400 Subject: [PATCH] RGW - fix bulkupload, broken by zipper Bulkupload depended on the existence of empty bucketinfo. Fix that, to avoid a crash. In additions, the error handler for swift used buckets. Fixes 46692 Signed-off-by: Daniel Gryniewicz --- src/rgw/rgw_common.cc | 2 +- src/rgw/rgw_op.cc | 37 ++++++++++++++++++++----------------- src/rgw/rgw_rest_swift.cc | 5 +++++ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 003f82c72845..de9b6cdd74f0 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -1017,7 +1017,7 @@ struct perm_state_from_req_state : public perm_state_base { perm_state_from_req_state(req_state * const _s) : perm_state_base(_s->cct, _s->env, _s->auth.identity.get(), - _s->bucket->get_info(), + _s->bucket.get() ? _s->bucket->get_info() : RGWBucketInfo(), _s->perm_mask, _s->defer_to_bucket_acls, _s->bucket_access_conf), diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 0325d1173e22..ae8aa1183581 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -6893,7 +6893,9 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path) /* we need to make sure we read bucket info, it's not read before for this * specific request */ - op_ret = store->get_bucket(s->user, s->bucket_tenant, bucket_name, &s->bucket); + std::unique_ptr bucket; + RGWBucketInfo binfo; + op_ret = store->get_bucket(s->user, s->bucket_tenant, bucket_name, &bucket); if (op_ret < 0 && op_ret != -ENOENT) { return op_ret; } @@ -6901,8 +6903,9 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path) if (bucket_exists) { RGWAccessControlPolicy old_policy(s->cct); - int r = rgw_op_get_bucket_policy_from_attr(s->cct, store, s->bucket->get_info(), - s->bucket->get_attrs().attrs, &old_policy); + binfo = bucket->get_info(); + int r = rgw_op_get_bucket_policy_from_attr(s->cct, store, binfo, + bucket->get_attrs().attrs, &old_policy); if (r >= 0) { if (old_policy.get_owner().get_id().compare(s->user->get_user()) != 0) { op_ret = -EEXIST; @@ -6943,19 +6946,19 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path) pmaster_num_shards = nullptr; } - rgw_placement_rule placement_rule(s->bucket->get_placement_rule(), s->info.storage_class); + rgw_placement_rule placement_rule(binfo.placement_rule, s->info.storage_class); if (bucket_exists) { rgw_placement_rule selected_placement_rule; - rgw_bucket bucket; - bucket.tenant = s->bucket_tenant; - bucket.name = s->bucket_name; + rgw_bucket new_bucket; + new_bucket.tenant = s->bucket_tenant; + new_bucket.name = s->bucket_name; op_ret = store->svc()->zone->select_bucket_placement(s->user->get_info(), store->svc()->zone->get_zonegroup().get_id(), placement_rule, &selected_placement_rule, nullptr); - if (selected_placement_rule != s->bucket->get_placement_rule()) { + if (selected_placement_rule != binfo.placement_rule) { op_ret = -EEXIST; ldpp_dout(this, 20) << "non-coherent placement rule" << dendl; return op_ret; @@ -6973,16 +6976,16 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path) RGWQuotaInfo quota_info; const RGWQuotaInfo * pquota_info = nullptr; - rgw_bucket bucket; - bucket.tenant = s->bucket_tenant; /* ignored if bucket exists */ - bucket.name = bucket_name; + rgw_bucket new_bucket; + new_bucket.tenant = s->bucket_tenant; /* ignored if bucket exists */ + new_bucket.name = bucket_name; RGWBucketInfo out_info; op_ret = store->getRados()->create_bucket(s->user->get_info(), - bucket, + new_bucket, store->svc()->zone->get_zonegroup().get_id(), - placement_rule, s->bucket->get_info().swift_ver_location, + placement_rule, binfo.swift_ver_location, pquota_info, attrs, out_info, pobjv, &ep_objv, creation_time, pmaster_bucket, pmaster_num_shards, true); @@ -7008,15 +7011,15 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path) ldpp_dout(this, 20) << "conflicting bucket name" << dendl; return op_ret; } - bucket = out_info.bucket; + new_bucket = out_info.bucket; } - op_ret = store->ctl()->bucket->link_bucket(s->user->get_id(), bucket, + op_ret = store->ctl()->bucket->link_bucket(s->user->get_id(), new_bucket, out_info.creation_time, s->yield, false); if (op_ret && !existed && op_ret != -EEXIST) { /* if it exists (or previously existed), don't remove it! */ - op_ret = store->ctl()->bucket->unlink_bucket(s->user->get_id(), bucket, s->yield); + op_ret = store->ctl()->bucket->unlink_bucket(s->user->get_id(), new_bucket, s->yield); if (op_ret < 0) { ldpp_dout(this, 0) << "WARNING: failed to unlink bucket: ret=" << op_ret << dendl; } @@ -7109,7 +7112,7 @@ int RGWBulkUploadOp::handle_file(const std::string_view path, return op_ret; } - if (s->bucket->versioning_enabled()) { + if (bucket->versioning_enabled()) { obj->gen_rand_obj_instance_name(); } diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index e2c7a2e0d2e0..bb434b209814 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -2385,6 +2385,11 @@ int RGWSwiftWebsiteHandler::serve_errordoc(const int http_ret, int RGWSwiftWebsiteHandler::error_handler(const int err_no, std::string* const error_content) { + if (!s->bucket.get()) { + /* No bucket, default no-op handler */ + return err_no; + } + const auto& ws_conf = s->bucket->get_info().website_conf; if (can_be_website_req() && ! ws_conf.error_doc.empty()) { -- 2.47.3