From a43d24861089a02f3b42061e482e05016a0021f6 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 12 May 2015 16:40:10 -0700 Subject: [PATCH] rgw: restore buffer of multipart upload after EEXIST Fixes #11604 Backport: hammer, firefly When we need to restart a write of part data, we need to revert to buffer to before the write, otherwise we're going to skip some data. Signed-off-by: Yehuda Sadeh (cherry picked from commit 580ccaec12daae64c38a1616d0be907bdd70a888) --- src/rgw/rgw_op.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index bf7247ef6595e..dab6c0a5437b3 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1781,6 +1781,12 @@ void RGWPutObj::execute() */ bool need_to_wait = (ofs == 0) && multipart; + bufferlist orig_data; + + if (need_to_wait) { + orig_data = data; + } + ret = put_data_and_throttle(processor, data, ofs, (need_calc_md5 ? &hash : NULL), need_to_wait); if (ret < 0) { if (!need_to_wait || ret != -EEXIST) { @@ -1790,6 +1796,9 @@ void RGWPutObj::execute() ldout(s->cct, 5) << "NOTICE: processor->throttle_data() returned -EEXIST, need to restart write" << dendl; + /* restore original data */ + data.swap(orig_data); + /* restart processing with different oid suffix */ dispose_processor(processor); -- 2.39.5