From: Casey Bodley Date: Thu, 28 Oct 2021 22:08:21 +0000 (-0400) Subject: rgw/sal: add MultipartUpload::get_owner() for ListMultipartUploads X-Git-Tag: v17.1.0~524^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9ee191da9c4ccb2e1c87b991f7afde7d5b3130e1;p=ceph.git rgw/sal: add MultipartUpload::get_owner() for ListMultipartUploads the ListMultipartUploads response includes an Owner and Initiator for each multipart upload in the list, but we were just returning the requesting user for every upload instead we get the real owner field out of rgw_bucket_dir_entry when listing the uploads, so need to store that with MultipartUpload for later use in RGWListBucketMultiparts_ObjStore_S3::send_response() Fixes: https://tracker.ceph.com/issues/52716 Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 4c3b326413b96..cbe292e511e1b 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -3901,8 +3901,9 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response() s->formatter->dump_string("Key", upload->get_key()); } s->formatter->dump_string("UploadId", upload->get_upload_id()); - dump_owner(s, s->user->get_id(), s->user->get_display_name(), "Initiator"); - dump_owner(s, s->user->get_id(), s->user->get_display_name()); + const ACLOwner& owner = upload->get_owner(); + dump_owner(s, owner.get_id(), owner.get_display_name(), "Initiator"); + dump_owner(s, owner.get_id(), owner.get_display_name()); // Owner s->formatter->dump_string("StorageClass", "STANDARD"); dump_time(s, "Initiated", upload->get_mtime()); s->formatter->close_section(); diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 55788a29dd7ef..23d2a43aa7ad3 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -262,7 +262,10 @@ class Store { virtual int get_oidc_providers(const DoutPrefixProvider *dpp, const std::string& tenant, std::vector>& providers) = 0; - virtual std::unique_ptr get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional upload_id=std::nullopt, ceph::real_time mtime=real_clock::now()) = 0; + virtual std::unique_ptr + get_multipart_upload(Bucket* bucket, const std::string& oid, + std::optional upload_id=std::nullopt, + ACLOwner owner={}, ceph::real_time mtime=real_clock::now()) = 0; virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, @@ -818,6 +821,7 @@ public: virtual const std::string& get_meta() const = 0; virtual const std::string& get_key() const = 0; virtual const std::string& get_upload_id() const = 0; + virtual const ACLOwner& get_owner() const = 0; virtual ceph::real_time get_mtime() const = 0; std::map>& get_parts() { return parts; } diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index fe019c95e23e2..a4c6bff9f458e 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -947,7 +947,10 @@ namespace rgw::sal { return 0; } - std::unique_ptr DBStore::get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional upload_id, ceph::real_time mtime) { + std::unique_ptr + DBStore::get_multipart_upload(Bucket* bucket, const std::string& oid, + std::optional upload_id, + ACLOwner owner, ceph::real_time mtime) { return nullptr; } diff --git a/src/rgw/rgw_sal_dbstore.h b/src/rgw/rgw_sal_dbstore.h index dd8b8aa05d00a..16e6ce0608b9d 100644 --- a/src/rgw/rgw_sal_dbstore.h +++ b/src/rgw/rgw_sal_dbstore.h @@ -540,7 +540,10 @@ protected: virtual int get_oidc_providers(const DoutPrefixProvider *dpp, const std::string& tenant, vector>& providers) override; - virtual std::unique_ptr get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional upload_id, ceph::real_time mtime) override; + virtual std::unique_ptr + get_multipart_upload(Bucket* bucket, const std::string& oid, + std::optional upload_id=std::nullopt, + ACLOwner owner={}, ceph::real_time mtime=ceph::real_clock::now()) override; virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, diff --git a/src/rgw/rgw_sal_rados.cc b/src/rgw/rgw_sal_rados.cc index 1e7b352590d65..bec5a57a01ee9 100644 --- a/src/rgw/rgw_sal_rados.cc +++ b/src/rgw/rgw_sal_rados.cc @@ -777,7 +777,10 @@ int RadosBucket::list_multiparts(const DoutPrefixProvider *dpp, if (!results.objs.empty()) { for (const rgw_bucket_dir_entry& dentry : results.objs) { rgw_obj_key key(dentry.key); - uploads.push_back(store->get_multipart_upload(this, key.name)); + ACLOwner owner(rgw_user(dentry.meta.owner)); + owner.set_name(dentry.meta.owner_display_name); + uploads.push_back(store->get_multipart_upload( + this, key.name, std::nullopt, std::move(owner))); } } if (common_prefixes) { @@ -1441,9 +1444,13 @@ int RadosStore::get_oidc_providers(const DoutPrefixProvider *dpp, return 0; } -std::unique_ptr RadosStore::get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional upload_id, ceph::real_time mtime) +std::unique_ptr +RadosStore::get_multipart_upload(Bucket* bucket, const std::string& oid, + std::optional upload_id, + ACLOwner owner, ceph::real_time mtime) { - return std::make_unique(this, bucket, oid, upload_id, mtime); + return std::make_unique(this, bucket, oid, upload_id, + std::move(owner), mtime); } std::unique_ptr RadosStore::get_append_writer(const DoutPrefixProvider *dpp, diff --git a/src/rgw/rgw_sal_rados.h b/src/rgw/rgw_sal_rados.h index 40951108873a7..b40bb02e19b27 100644 --- a/src/rgw/rgw_sal_rados.h +++ b/src/rgw/rgw_sal_rados.h @@ -444,7 +444,10 @@ class RadosStore : public Store { virtual int get_oidc_providers(const DoutPrefixProvider *dpp, const std::string& tenant, std::vector>& providers) override; - virtual std::unique_ptr get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional upload_id=std::nullopt, ceph::real_time mtime=real_clock::now()) override; + virtual std::unique_ptr + get_multipart_upload(Bucket* bucket, const std::string& oid, + std::optional upload_id=std::nullopt, + ACLOwner owner={}, ceph::real_time mtime=real_clock::now()) override; virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, optional_yield y, std::unique_ptr _head_obj, @@ -514,17 +517,23 @@ public: class RadosMultipartUpload : public MultipartUpload { RadosStore* store; RGWMPObj mp_obj; + ACLOwner owner; ceph::real_time mtime; rgw_placement_rule placement; RGWObjManifest manifest; public: - RadosMultipartUpload(RadosStore* _store, Bucket* _bucket, const std::string& oid, std::optional upload_id, ceph::real_time _mtime) : MultipartUpload(_bucket), store(_store), mp_obj(oid, upload_id), mtime(_mtime) {} + RadosMultipartUpload(RadosStore* _store, Bucket* _bucket, const std::string& oid, + std::optional upload_id, ACLOwner owner, + ceph::real_time _mtime) + : MultipartUpload(_bucket), store(_store), mp_obj(oid, upload_id), + owner(owner), mtime(_mtime) {} virtual ~RadosMultipartUpload() = default; virtual const std::string& get_meta() const override { return mp_obj.get_meta(); } virtual const std::string& get_key() const override { return mp_obj.get_key(); } virtual const std::string& get_upload_id() const override { return mp_obj.get_upload_id(); } + virtual const ACLOwner& get_owner() const override { return owner; } virtual ceph::real_time get_mtime() const override { return mtime; } virtual std::unique_ptr get_meta_obj() override; virtual int init(const DoutPrefixProvider* dpp, optional_yield y, RGWObjectCtx* obj_ctx, ACLOwner& owner, rgw_placement_rule& dest_placement, rgw::sal::Attrs& attrs) override;