From 64d3aaf110cb97fb2c6a5decc93110c5e17a1b08 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 23 Aug 2013 15:39:20 -0700 Subject: 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. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_op.cc | 2 +- src/rgw/rgw_rados.cc | 15 +++++++++++---- 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& 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& 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 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() {} -- cgit v1.2.1