From bdd0635fbb0632c881e8f38c563f88d0957688bf 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 --- 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 20a8c84d153f7..c6f4ae912624c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1589,7 +1589,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, @@ -1606,6 +1606,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; @@ -1620,7 +1622,7 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, obj_ctx.set_atomic(part); store->getRados()->set_prefetch_data(&obj_ctx, part); - RGWRados::Object op_target(store->getRados(), s->bucket_info, obj_ctx, part); + RGWRados::Object op_target(store->getRados(), bucket_info, obj_ctx, part); RGWRados::Object::Read read_op(&op_target); if (!swift_slo) { @@ -1701,7 +1703,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, @@ -1762,7 +1764,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; @@ -1791,7 +1793,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; @@ -1802,7 +1804,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, @@ -1862,7 +1864,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 */); @@ -1877,7 +1879,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, @@ -1888,7 +1890,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) @@ -2004,7 +2006,7 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) vector allocated_acls; map>> policies; - map buckets; + map bucket_infos; map slo_parts; @@ -2035,6 +2037,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; @@ -2043,7 +2046,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(); @@ -2071,11 +2074,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(); } @@ -2083,11 +2087,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 494e6c1611a08..7a398fe1f6dc7 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -342,7 +342,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 fb392828a42ac..0f919f0f6dfdf 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -846,8 +846,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; r = store->getRados()->get_bucket_info(store->svc(), s->user->get_id().tenant, bucket_name, bucket_info, nullptr, @@ -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->getRados(), s->bucket_info, obj_ctx, slo_seg); + RGWRados::Object op_target(store->getRados(), *pbucket_info, obj_ctx, slo_seg); RGWRados::Object::Read read_op(&op_target); bool compressed; -- 2.39.5