From: Casey Bodley Date: Wed, 14 Feb 2024 14:43:14 +0000 (-0500) Subject: rgw/putobj: RadosWriter uses part head object for multipart parts X-Git-Tag: v17.2.8~361^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9f593afe58a10ed495102aae2ccd2b22bbf3be08;p=ceph.git rgw/putobj: RadosWriter uses part head object for multipart parts 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 (cherry picked from commit bbbf5c54bdce3061ae9831c49fe065311a2e156d) Conflicts: sal::Object instead of rgw_raw_obj src/rgw/rgw_putobj_processor.cc src/rgw/rgw_putobj_processor.h --- diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 8292df5bf5b6..8618b8cd8e06 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -90,6 +90,11 @@ void RadosWriter::add_write_hint(librados::ObjectWriteOperation& op) { op.set_alloc_hint2(0, 0, alloc_hint_flags); } +void RadosWriter::set_head_obj(std::unique_ptr head) +{ + head_obj = std::move(head); +} + int RadosWriter::set_stripe_obj(const rgw_raw_obj& raw_obj) { stripe_obj = store->svc()->rados->obj(raw_obj); @@ -413,6 +418,9 @@ int MultipartObjectProcessor::prepare_head() dynamic_cast(head_obj.get())->raw_obj_to_obj(stripe_obj); head_obj->set_hash_source(target_obj->get_name()); + // point part uploads at the part head instead of the final multipart head + writer.set_head_obj(head_obj->clone()); + r = writer.set_stripe_obj(stripe_obj); if (r < 0) { return r; diff --git a/src/rgw/rgw_putobj_processor.h b/src/rgw/rgw_putobj_processor.h index 5aa4d6233987..48a41c0958ea 100644 --- a/src/rgw/rgw_putobj_processor.h +++ b/src/rgw/rgw_putobj_processor.h @@ -91,6 +91,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(std::unique_ptr head); + // change the current stripe object int set_stripe_obj(const rgw_raw_obj& obj);