diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-08-23 15:39:20 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-08-23 15:39:20 -0700 |
commit | 64d3aaf110cb97fb2c6a5decc93110c5e17a1b08 (patch) | |
tree | b568ca671ac946ae2d905566cda3dc0546de2124 | |
parent | 0373d749cea7d9b532069ba8ebca2f005b2c9f59 (diff) | |
download | ceph-wip-6111.tar.gz |
rgw: flush pending data when completing multipart part uploadwip-6111
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.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_op.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 15 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 1 |
3 files changed, 13 insertions, 5 deletions
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index d34e18bc4ba..9c7826f6e7b 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1166,7 +1166,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; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 03cc1ebfdb3..60d089ba09d 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<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; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index e6ab244afa9..4690279f93f 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() {} |