From 04282ae3c1d19bf185ee1df148eb84deb244630f Mon Sep 17 00:00:00 2001 From: "lu.shasha" Date: Thu, 18 Aug 2022 15:07:42 +0800 Subject: [PATCH] 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 --- src/rgw/rgw_putobj_processor.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 0b4579169c5..c2c2c476016 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) { -- 2.47.3