]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
RGW - fix bulkupload, broken by zipper
authorDaniel Gryniewicz <dang@redhat.com>
Thu, 23 Jul 2020 16:38:11 +0000 (12:38 -0400)
committerDaniel Gryniewicz <dang@redhat.com>
Fri, 24 Jul 2020 18:42:50 +0000 (14:42 -0400)
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 <dang@redhat.com>
src/rgw/rgw_common.cc
src/rgw/rgw_op.cc
src/rgw/rgw_rest_swift.cc

index 003f82c728456dc6f15576e26d0b23760335a2e3..de9b6cdd74f0a82795942b5da951deae5ef1bb37 100644 (file)
@@ -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),
index 0325d1173e2299269c046166c963f22822bc06bd..ae8aa11835814c5b3f9195b975261c162d29d0d7 100644 (file)
@@ -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<rgw::sal::RGWBucket> 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();
   }
 
index e2c7a2e0d2e0a7a94becbf4744479a60f39debf5..bb434b20981430abe86de36e6408eced49f84692 100644 (file)
@@ -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()) {