From: lu.shasha Date: Tue, 3 Dec 2024 07:46:35 +0000 (+0800) Subject: rgw: fix data corruption when rados op return ETIMEDOUT X-Git-Tag: v19.2.3~257^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=63505589868855553843346e257b74cc7e794e89;p=ceph.git 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 (cherry picked from commit 23fcab7fc6b4b4aa3c1d06f65eb4e7ebb0e86311) --- diff --git a/src/rgw/driver/rados/rgw_putobj_processor.cc b/src/rgw/driver/rados/rgw_putobj_processor.cc index d41678cdb06b..d185fd76f620 100644 --- a/src/rgw/driver/rados/rgw_putobj_processor.cc +++ b/src/rgw/driver/rados/rgw_putobj_processor.cc @@ -586,6 +586,11 @@ int MultipartObjectProcessor::complete(size_t accounted_size, r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, &op, rctx.y); } 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; } @@ -766,6 +771,11 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c accounted_size + *cur_accounted_size, 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) {