]> 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:08:53 +0000 (11:08 -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 d436e3a67e06877a0d21e42a78e2a442976dfd48..cc557d8b5d5e80d9947405a5c6709916d9252644 100644 (file)
@@ -1627,6 +1627,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) {
@@ -1636,6 +1642,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);