From: lu.shasha Date: Thu, 18 Aug 2022 07:07:42 +0000 (+0800) Subject: rgw: fix data corruption due to network jitter X-Git-Tag: v18.0.0~113^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=04282ae3c1d19bf185ee1df148eb84deb244630f;p=ceph.git rgw: fix data corruption due to network jitter In function RGWRados::Object::Write::_do_write_meta rgw_rados_operate may return -ETIMEDOUT due to network jitter. But head obj may eventually be written successfully even if return -ETIMEDOUT. Due to r < 0, meta.canceled be set true. In such scenario, all the tail objects will removed in the destructor of RadosWriter, then data corruptted. To avoid data corruption, when return -ETIMEDOUT, should clear all objects in RadosWriter. Signed-off-by: Shasha Lu --- diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 0b4579169c5a..c2c2c476016f 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -331,6 +331,11 @@ int AtomicObjectProcessor::complete(size_t accounted_size, r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y); if (r < 0) { + if (r == -ETIMEDOUT) { + // The head object write may eventually succeed, clear the set of objects for deletion. if it + // doesn't ever succeed, we'll orphan any tail objects as if we'd crashed before that write + writer.clear_written(); + } return r; } if (!obj_op.meta.canceled) {