From 5583ae19069ed246b326b7f98d2bc5446d098077 Mon Sep 17 00:00:00 2001 From: zhangzhiming Date: Mon, 15 Mar 2021 09:42:33 +0800 Subject: [PATCH] rgw: Use correct bucket info when put or get large object with swift. Fixes: https://tracker.ceph.com/issues/49791 Signed-off-by: zhiming zhang Signed-off-by: yupeng chen (cherry picked from commit bdd0635fbb0632c881e8f38c563f88d0957688bf) Conflicts: src/rgw/rgw_op.cc src/rgw/rgw_rest_swift.cc -In octopus: - RGWRados::Object op_target(store->getRados(), ...) -In nautilus: - RGWRados::Object op_target(store, ...) --- src/rgw/rgw_op.cc | 34 +++++++++++++++++++--------------- src/rgw/rgw_op.h | 2 +- src/rgw/rgw_rest_swift.cc | 7 +++++-- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index c2501b7842a45..5560bafd4a4c2 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1390,7 +1390,7 @@ bool RGWOp::generate_cors_headers(string& origin, string& method, string& header return true; } -int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, +int RGWGetObj::read_user_manifest_part(RGWBucketInfo& bucket_info, const rgw_bucket_dir_entry& ent, RGWAccessControlPolicy * const bucket_acl, const boost::optional& bucket_policy, @@ -1407,6 +1407,8 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, int64_t cur_ofs = start_ofs; int64_t cur_end = end_ofs; + rgw_bucket& bucket = bucket_info.bucket; + rgw_obj part(bucket, ent.key); map attrs; @@ -1421,7 +1423,7 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, obj_ctx.set_atomic(part); store->set_prefetch_data(&obj_ctx, part); - RGWRados::Object op_target(store, s->bucket_info, obj_ctx, part); + RGWRados::Object op_target(store, bucket_info, obj_ctx, part); RGWRados::Object::Read read_op(&op_target); if (!swift_slo) { @@ -1502,7 +1504,7 @@ static int iterate_user_manifest_parts(CephContext * const cct, uint64_t * const ptotal_len, uint64_t * const pobj_size, string * const pobj_sum, - int (*cb)(rgw_bucket& bucket, + int (*cb)(RGWBucketInfo& bucket_info, const rgw_bucket_dir_entry& ent, RGWAccessControlPolicy * const bucket_acl, const boost::optional& bucket_policy, @@ -1563,7 +1565,7 @@ static int iterate_user_manifest_parts(CephContext * const cct, len_count += end_ofs - start_ofs; if (cb) { - r = cb(bucket, ent, bucket_acl, bucket_policy, start_ofs, end_ofs, + r = cb(*pbucket_info, ent, bucket_acl, bucket_policy, start_ofs, end_ofs, cb_param, false /* swift_slo */); if (r < 0) { return r; @@ -1592,7 +1594,7 @@ static int iterate_user_manifest_parts(CephContext * const cct, struct rgw_slo_part { RGWAccessControlPolicy *bucket_acl = nullptr; Policy* bucket_policy = nullptr; - rgw_bucket bucket; + RGWBucketInfo *pbucket_info = nullptr; string obj_name; uint64_t size = 0; string etag; @@ -1603,7 +1605,7 @@ static int iterate_slo_parts(CephContext *cct, off_t ofs, off_t end, map& slo_parts, - int (*cb)(rgw_bucket& bucket, + int (*cb)(RGWBucketInfo& bucket_info, const rgw_bucket_dir_entry& ent, RGWAccessControlPolicy *bucket_acl, const boost::optional& bucket_policy, @@ -1663,7 +1665,7 @@ static int iterate_slo_parts(CephContext *cct, << dendl; // SLO is a Swift thing, and Swift has no knowledge of S3 Policies. - int r = cb(part.bucket, ent, part.bucket_acl, + int r = cb(*(part.pbucket_info), ent, part.bucket_acl, (part.bucket_policy ? boost::optional(*part.bucket_policy) : none), start_ofs, end_ofs, cb_param, true /* swift_slo */); @@ -1678,7 +1680,7 @@ static int iterate_slo_parts(CephContext *cct, return 0; } -static int get_obj_user_manifest_iterate_cb(rgw_bucket& bucket, +static int get_obj_user_manifest_iterate_cb(RGWBucketInfo& bucket_info, const rgw_bucket_dir_entry& ent, RGWAccessControlPolicy * const bucket_acl, const boost::optional& bucket_policy, @@ -1689,7 +1691,7 @@ static int get_obj_user_manifest_iterate_cb(rgw_bucket& bucket, { RGWGetObj *op = static_cast(param); return op->read_user_manifest_part( - bucket, ent, bucket_acl, bucket_policy, start_ofs, end_ofs, swift_slo); + bucket_info, ent, bucket_acl, bucket_policy, start_ofs, end_ofs, swift_slo); } int RGWGetObj::handle_user_manifest(const char *prefix) @@ -1805,7 +1807,7 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) vector allocated_acls; map>> policies; - map buckets; + map bucket_infos; map slo_parts; @@ -1836,6 +1838,7 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) string obj_name = path.substr(pos_sep + 1); rgw_bucket bucket; + RGWBucketInfo *pbucket_info; RGWAccessControlPolicy *bucket_acl; Policy* bucket_policy; @@ -1844,7 +1847,7 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) if (piter != policies.end()) { bucket_acl = piter->second.first; bucket_policy = piter->second.second.get_ptr(); - bucket = buckets[bucket_name]; + pbucket_info = &bucket_infos[bucket_name]; } else { allocated_acls.push_back(RGWAccessControlPolicy(s->cct)); RGWAccessControlPolicy& _bucket_acl = allocated_acls.back(); @@ -1872,11 +1875,12 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) auto _bucket_policy = get_iam_policy_from_attr( s->cct, store, bucket_attrs, bucket_info.bucket.tenant); bucket_policy = _bucket_policy.get_ptr(); - buckets[bucket_name] = bucket; + bucket_infos.emplace(bucket_name, std::move(bucket_info)); + pbucket_info = &bucket_infos[bucket_name]; policies[bucket_name] = make_pair(bucket_acl, _bucket_policy); } } else { - bucket = s->bucket; + pbucket_info = &s->bucket_info; bucket_acl = s->bucket_acl.get(); bucket_policy = s->iam_policy.get_ptr(); } @@ -1884,11 +1888,11 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) rgw_slo_part part; part.bucket_acl = bucket_acl; part.bucket_policy = bucket_policy; - part.bucket = bucket; + part.pbucket_info = pbucket_info; part.obj_name = obj_name; part.size = entry.size_bytes; part.etag = entry.etag; - ldpp_dout(this, 20) << "slo_part: bucket=" << part.bucket + ldpp_dout(this, 20) << "slo_part: bucket=" << part.pbucket_info->bucket << " obj=" << part.obj_name << " size=" << part.size << " etag=" << part.etag diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e76b12581f96c..11805a58e3ee1 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -340,7 +340,7 @@ public: void execute() override; int parse_range(); int read_user_manifest_part( - rgw_bucket& bucket, + RGWBucketInfo& bucket_info, const rgw_bucket_dir_entry& ent, RGWAccessControlPolicy * const bucket_acl, const boost::optional& bucket_policy, diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 6c6d7b55f3e85..3a38077d4dabf 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -845,8 +845,9 @@ int RGWPutObj_ObjStore_SWIFT::update_slo_segment_size(rgw_slo_entry& entry) { rgw_bucket bucket; + RGWBucketInfo *pbucket_info = nullptr; + RGWBucketInfo bucket_info; if (bucket_name.compare(s->bucket.name) != 0) { - RGWBucketInfo bucket_info; map bucket_attrs; auto obj_ctx = store->svc.sysobj->init_obj_ctx(); r = store->get_bucket_info(obj_ctx, s->user->user_id.tenant, @@ -858,8 +859,10 @@ int RGWPutObj_ObjStore_SWIFT::update_slo_segment_size(rgw_slo_entry& entry) { return r; } bucket = bucket_info.bucket; + pbucket_info = &bucket_info; } else { bucket = s->bucket; + pbucket_info = &s->bucket_info; } /* fetch the stored size of the seg (or error if not valid) */ @@ -870,7 +873,7 @@ int RGWPutObj_ObjStore_SWIFT::update_slo_segment_size(rgw_slo_entry& entry) { RGWObjectCtx obj_ctx(store); obj_ctx.set_atomic(slo_seg); - RGWRados::Object op_target(store, s->bucket_info, obj_ctx, slo_seg); + RGWRados::Object op_target(store, *pbucket_info, obj_ctx, slo_seg); RGWRados::Object::Read read_op(&op_target); bool compressed; -- 2.39.5