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>
(cherry picked from commit
bbbf5c54bdce3061ae9831c49fe065311a2e156d)
Conflicts:
rgw_putobj_processor.* uses sal::RGWObject instead of rgw_obj
return error.value_or(0);
}
+void RadosWriter::set_head_obj(std::unique_ptr<rgw::sal::RGWObject> 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);
head_obj->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;
~RadosWriter();
+ // change the head object
+ void set_head_obj(std::unique_ptr<rgw::sal::RGWObject> head);
+
// change the current stripe object
int set_stripe_obj(const rgw_raw_obj& obj);