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 <lu.shasha@aishu.cn>
(cherry picked from commit
04282ae3c1d19bf185ee1df148eb84deb244630f)
r = obj_op->prepare(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;
}