]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw/s3: add part param and response to GetObj
authorCasey Bodley <cbodley@redhat.com>
Fri, 17 Feb 2023 03:50:37 +0000 (22:50 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 27 Mar 2025 17:57:12 +0000 (13:57 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 3354b67fbdf5f37bb58ff07743426e179bed8069)

src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index 1474d7720fb342a235ea5074a8f9e54a489cc8f6..86cd202b5117b7a7acc93fef50859716874878a4 100644 (file)
@@ -375,6 +375,11 @@ protected:
   bool get_retention;
   bool get_legal_hold;
 
+  // optional partNumber param for s3
+  std::optional<int> multipart_part_num;
+  // PartsCount response when partNumber is specified
+  std::optional<int> multipart_parts_count;
+
   int init_common();
 public:
   RGWGetObj() {
index 950a20ad1f93cf53f605c1dc6fc11dbd14071e63..5a3f0dd7aebe6f8543fc33ed0885d7de8401c167 100644 (file)
@@ -305,6 +305,18 @@ int RGWGetObj_ObjStore_S3::get_params(optional_yield y)
 
   dst_zone_trace = s->info.args.get(RGW_SYS_PARAM_PREFIX "if-not-replicated-to");
 
+  // optional part number
+  auto optstr = s->info.args.get_optional("partNumber");
+  if (optstr) {
+    string err;
+    multipart_part_num = strict_strtol(optstr->c_str(), 10, &err);
+    if (!err.empty()) {
+      s->err.message = "Invalid partNumber: " + err;
+      ldpp_dout(s, 10) << "bad part number " << *optstr << ": " << err << dendl;
+      return -ERR_INVALID_PART;
+    }
+  }
+
   return RGWGetObj_ObjStore::get_params(y);
 }
 
@@ -451,6 +463,9 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs,
       }
     } catch (const buffer::error&) {} // omit x-rgw-replicated-from headers
   }
+  if (multipart_parts_count) {
+    dump_header(s, "x-amz-mp-parts-count", *multipart_parts_count);
+  }
 
   if (! op_ret) {
     if (! lo_etag.empty()) {