]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: flush pending data when completing multipart part upload
authorYehuda Sadeh <yehuda@inktank.com>
Fri, 23 Aug 2013 22:39:20 +0000 (15:39 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 4 Sep 2013 23:41:46 +0000 (16:41 -0700)
Fixes: #6111
Backport: dumpling
When completing the part upload we need to flush any data that we
aggregated and didn't flush yet. With earlier code didn't have to deal
with it as for multipart upload we didn't have any pending data.
What we do now is we call the regular atomic data completion
function that takes care of it.

Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 15e51712ca39a6cc3d0f0c6b8ee03002e131bc16..b5ed3e7fd6fd48fe9234097bdae5e493a061754c 100644 (file)
@@ -1271,7 +1271,7 @@ int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, void *obj_ctx)
 
 int RGWPutObjProcessor_Multipart::do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs)
 {
-  complete_parts();
+  complete_writing_data();
 
   RGWRados::PutObjMetaExtraParams params;
   params.set_mtime = set_mtime;
index 05db9bff7825f51c9d1e9fa0fc4a7e8abc4ae6c8..0c2119ecf9db40e8363c9f5ab5debf073ee19b57 100644 (file)
@@ -741,7 +741,7 @@ void RGWPutObjProcessor_Atomic::complete_parts()
     prepare_next_part(obj_len);
 }
 
-int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs)
+int RGWPutObjProcessor_Atomic::complete_writing_data()
 {
   if (!data_ofs && !immutable_head()) {
     first_chunk.claim(pending_data_bl);
@@ -761,6 +761,13 @@ int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, time_t s
     }
   }
   complete_parts();
+  return 0;
+}
+
+int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) {
+  int r = complete_writing_data();
+  if (r < 0)
+    return r;
 
   store->set_atomic(obj_ctx, head_obj);
 
@@ -772,9 +779,9 @@ int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, time_t s
   extra_params.mtime = mtime;
   extra_params.set_mtime = set_mtime;
 
-  int r = store->put_obj_meta(obj_ctx, head_obj, obj_len, attrs,
-                              RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE,
-                             extra_params);
+  r = store->put_obj_meta(obj_ctx, head_obj, obj_len, attrs,
+                          RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE,
+                          extra_params);
   return r;
 }
 
index 0da6f4669bf1519dbd78d830228afb2a6598261e..ef98ec1f9fbdb88044622d1bd271424e6a540512 100644 (file)
@@ -284,6 +284,7 @@ protected:
 
   void prepare_next_part(off_t ofs);
   void complete_parts();
+  int complete_writing_data();
 
 public:
   ~RGWPutObjProcessor_Atomic() {}