]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/putobj: RadosWriter uses part head object for multipart parts 55582/head
authorCasey Bodley <cbodley@redhat.com>
Wed, 14 Feb 2024 14:43:14 +0000 (09:43 -0500)
committerCasey Bodley <cbodley@redhat.com>
Wed, 14 Feb 2024 14:43:18 +0000 (09:43 -0500)
the cleanup logic in the RadosWrite destructor was using the wrong
`head_obj` to avoid races between cleanup and part re-uploads. it
pointed at the final location of the multipart upload, rather than the
head object of the current part

Fixes: https://tracker.ceph.com/issues/63642
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/driver/rados/rgw_putobj_processor.cc
src/rgw/driver/rados/rgw_putobj_processor.h

index d7462587c87cb3f44d82de05d97c9fd89964aaff..846e2323caf7b87edcb554c547c0243ab0fc58ab 100644 (file)
@@ -124,6 +124,11 @@ void RadosWriter::add_write_hint(librados::ObjectWriteOperation& op) {
   op.set_alloc_hint2(0, 0, alloc_hint_flags);
 }
 
+void RadosWriter::set_head_obj(const rgw_obj& head)
+{
+  head_obj = head;
+}
+
 int RadosWriter::set_stripe_obj(const rgw_raw_obj& raw_obj)
 {
   return rgw_get_rados_ref(dpp, store->get_rados_handle(), raw_obj,
@@ -458,6 +463,9 @@ int MultipartObjectProcessor::prepare_head()
   RGWSI_Tier_RADOS::raw_obj_to_obj(head_obj.bucket, stripe_obj, &head_obj);
   head_obj.index_hash_source = target_obj.key.name;
 
+  // point part uploads at the part head instead of the final multipart head
+  writer.set_head_obj(head_obj);
+
   r = writer.set_stripe_obj(stripe_obj);
   if (r < 0) {
     return r;
index 53b14c41ee08ec92b84de8a0ed748953d24a0b9f..17388f3fbaf3b8af5452e6ed2f7a95a6451d85d8 100644 (file)
@@ -68,7 +68,7 @@ class RadosWriter : public rgw::sal::DataProcessor {
   RGWRados *const store;
   const RGWBucketInfo& bucket_info;
   RGWObjectCtx& obj_ctx;
-  const rgw_obj head_obj;
+  rgw_obj head_obj;
   rgw_rados_ref stripe_obj; // current stripe object
   RawObjSet written; // set of written objects for deletion
   const DoutPrefixProvider *dpp;
@@ -87,6 +87,9 @@ class RadosWriter : public rgw::sal::DataProcessor {
   // add alloc hint to osd
   void add_write_hint(librados::ObjectWriteOperation& op);
 
+  // change the head object
+  void set_head_obj(const rgw_obj& head);
+
   // change the current stripe object
   int set_stripe_obj(const rgw_raw_obj& obj);