Skip to content

Commit 23fcab7

Browse files
committed
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 <[email protected]>
1 parent baa6b7b commit 23fcab7

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

src/rgw/driver/rados/rgw_putobj_processor.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,11 @@ int MultipartObjectProcessor::complete(
597597
}
598598

599599
if (r < 0) {
600+
if (r == -ETIMEDOUT) {
601+
// The meta_obj_ref write may eventually succeed, clear the set of objects for deletion. if it
602+
// doesn't ever succeed, we'll orphan any tail objects as if we'd crashed before that write
603+
writer.clear_written();
604+
}
600605
return r == -ENOENT ? -ERR_NO_SUCH_UPLOAD : r;
601606
}
602607

@@ -783,6 +788,11 @@ int AppendObjectProcessor::complete(
783788
attrs, rctx, writer.get_trace(),
784789
flags & rgw::sal::FLAG_LOG_OP);
785790
if (r < 0) {
791+
if (r == -ETIMEDOUT) {
792+
// The head object write may eventually succeed, clear the set of objects for deletion. if it
793+
// doesn't ever succeed, we'll orphan any tail objects as if we'd crashed before that write
794+
writer.clear_written();
795+
}
786796
return r;
787797
}
788798
if (!obj_op.meta.canceled) {

0 commit comments

Comments
 (0)