From: Yehuda Sadeh Date: Fri, 23 Aug 2013 22:39:20 +0000 (-0700) Subject: rgw: flush pending data when completing multipart part upload X-Git-Tag: v0.69~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9a551296e0811f2b65972377b25bb28dbb42f575;p=ceph.git rgw: flush pending data when completing multipart part upload 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 Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 15e51712ca39..b5ed3e7fd6fd 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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& attrs) { - complete_parts(); + complete_writing_data(); RGWRados::PutObjMetaExtraParams params; params.set_mtime = set_mtime; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 05db9bff7825..0c2119ecf9db 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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& 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& 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; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 0da6f4669bf1..ef98ec1f9fbd 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -284,6 +284,7 @@ protected: void prepare_next_part(off_t ofs); void complete_parts(); + int complete_writing_data(); public: ~RGWPutObjProcessor_Atomic() {}