From 23fcab7fc6b4b4aa3c1d06f65eb4e7ebb0e86311 Mon Sep 17 00:00:00 2001 From: "lu.shasha" Date: Tue, 3 Dec 2024 15:46:35 +0800 Subject: [PATCH] rgw: fix data corruption when rados op return ETIMEDOUT when rados op return ETIMEOUT, rgw can't determine whether or not the rados op succeeded, To avoid data corruption, when return -ETIMEDOUT, we should clear all objects in RadosWriter Signed-off-by: Shasha Lu --- src/rgw/driver/rados/rgw_putobj_processor.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/rgw/driver/rados/rgw_putobj_processor.cc b/src/rgw/driver/rados/rgw_putobj_processor.cc index f04ed1db8d4..9e27c5adbc9 100644 --- a/src/rgw/driver/rados/rgw_putobj_processor.cc +++ b/src/rgw/driver/rados/rgw_putobj_processor.cc @@ -597,6 +597,11 @@ int MultipartObjectProcessor::complete( } if (r < 0) { + if (r == -ETIMEDOUT) { + // The meta_obj_ref 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 == -ENOENT ? -ERR_NO_SUCH_UPLOAD : r; } @@ -783,6 +788,11 @@ int AppendObjectProcessor::complete( attrs, rctx, writer.get_trace(), flags & rgw::sal::FLAG_LOG_OP); 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.39.5