]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: restore buffer of multipart upload after EEXIST
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 12 May 2015 23:40:10 +0000 (16:40 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 15 May 2015 18:35:18 +0000 (11:35 -0700)
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 <yehuda@redhat.com>
(cherry picked from commit 580ccaec12daae64c38a1616d0be907bdd70a888)

src/rgw/rgw_op.cc

index bf7247ef6595e25c40ddeb6c83e0e49cc4808ba5..dab6c0a5437b3031141ff4772411a82d1aeb9887 100644 (file)
@@ -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);