From 580ccaec12daae64c38a1616d0be907bdd70a888 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 --- 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 35c27d8edbb7..77fb4e8bdebb 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1807,6 +1807,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) { @@ -1816,6 +1822,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.47.3