]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/sal: add MultipartUpload::get_owner() for ListMultipartUploads 43715/head
authorCasey Bodley <cbodley@redhat.com>
Thu, 28 Oct 2021 22:08:21 +0000 (18:08 -0400)
committerCasey Bodley <cbodley@redhat.com>
Thu, 28 Oct 2021 22:46:57 +0000 (18:46 -0400)
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 <cbodley@redhat.com>
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_sal.h
src/rgw/rgw_sal_dbstore.cc
src/rgw/rgw_sal_dbstore.h
src/rgw/rgw_sal_rados.cc
src/rgw/rgw_sal_rados.h

index 4c3b326413b960438b8e49352bf4bd0d541183b0..cbe292e511e1bc74ab7677bbc4ea7c1c3f75e4ba 100644 (file)
@@ -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();
index 55788a29dd7ef95cb613d6ebaef84fe8a8ce49cf..23d2a43aa7ad3d8b38de1d368a4d9aab90d1341c 100644 (file)
@@ -262,7 +262,10 @@ class Store {
     virtual int get_oidc_providers(const DoutPrefixProvider *dpp,
                                   const std::string& tenant,
                                   std::vector<std::unique_ptr<RGWOIDCProvider>>& providers) = 0;
-    virtual std::unique_ptr<MultipartUpload> get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional<std::string> upload_id=std::nullopt, ceph::real_time mtime=real_clock::now()) = 0;
+    virtual std::unique_ptr<MultipartUpload>
+    get_multipart_upload(Bucket* bucket, const std::string& oid,
+                         std::optional<std::string> upload_id=std::nullopt,
+                         ACLOwner owner={}, ceph::real_time mtime=real_clock::now()) = 0;
     virtual std::unique_ptr<Writer> get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<uint32_t, std::unique_ptr<MultipartPart>>& get_parts() { return parts; }
index fe019c95e23e26680e36c55504f8d50c84b23bf8..a4c6bff9f458e630a2c794004245a599633d6756 100644 (file)
@@ -947,7 +947,10 @@ namespace rgw::sal {
     return 0;
   }
 
-  std::unique_ptr<MultipartUpload> DBStore::get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional<std::string> upload_id, ceph::real_time mtime) {
+  std::unique_ptr<MultipartUpload>
+  DBStore::get_multipart_upload(Bucket* bucket, const std::string& oid,
+                                std::optional<std::string> upload_id,
+                                ACLOwner owner, ceph::real_time mtime) {
     return nullptr;
   }
 
index dd8b8aa05d00aaf099b3fceef6d6b811ce07c98e..16e6ce0608b9daaf9d93fdcca38f07b1c1c6adff 100644 (file)
@@ -540,7 +540,10 @@ protected:
       virtual int get_oidc_providers(const DoutPrefixProvider *dpp,
           const std::string& tenant,
           vector<std::unique_ptr<RGWOIDCProvider>>& providers) override;
-      virtual std::unique_ptr<MultipartUpload> get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional<std::string> upload_id, ceph::real_time mtime) override;
+      virtual std::unique_ptr<MultipartUpload>
+      get_multipart_upload(Bucket* bucket, const std::string& oid,
+                           std::optional<std::string> upload_id=std::nullopt,
+                           ACLOwner owner={}, ceph::real_time mtime=ceph::real_clock::now()) override;
       virtual std::unique_ptr<Writer> get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _head_obj,
index 1e7b352590d652cd6716e25d16f42bc1748e66f1..bec5a57a01ee945a2d934931d8f3894e79ca9948 100644 (file)
@@ -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<MultipartUpload> RadosStore::get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional<std::string> upload_id, ceph::real_time mtime)
+std::unique_ptr<MultipartUpload>
+RadosStore::get_multipart_upload(Bucket* bucket, const std::string& oid,
+                                 std::optional<std::string> upload_id,
+                                 ACLOwner owner, ceph::real_time mtime)
 {
-  return std::make_unique<RadosMultipartUpload>(this, bucket, oid, upload_id, mtime);
+  return std::make_unique<RadosMultipartUpload>(this, bucket, oid, upload_id,
+                                                std::move(owner), mtime);
 }
 
 std::unique_ptr<Writer> RadosStore::get_append_writer(const DoutPrefixProvider *dpp,
index 40951108873a7819fb3dbcfa13ae80039665cc4e..b40bb02e19b275068f68599f97f33f2916d3bbd4 100644 (file)
@@ -444,7 +444,10 @@ class RadosStore : public Store {
     virtual int get_oidc_providers(const DoutPrefixProvider *dpp,
                                   const std::string& tenant,
                                   std::vector<std::unique_ptr<RGWOIDCProvider>>& providers) override;
-    virtual std::unique_ptr<MultipartUpload> get_multipart_upload(Bucket* bucket, const std::string& oid, std::optional<std::string> upload_id=std::nullopt, ceph::real_time mtime=real_clock::now()) override;
+    virtual std::unique_ptr<MultipartUpload>
+    get_multipart_upload(Bucket* bucket, const std::string& oid,
+                         std::optional<std::string> upload_id=std::nullopt,
+                         ACLOwner owner={}, ceph::real_time mtime=real_clock::now()) override;
     virtual std::unique_ptr<Writer> get_append_writer(const DoutPrefixProvider *dpp,
                                  optional_yield y,
                                  std::unique_ptr<rgw::sal::Object> _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<std::string> 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<std::string> 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<rgw::sal::Object> 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;