summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-08-23 15:39:20 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-09-04 16:49:27 -0700
commit211c5f13131e28b095a1f3b72426128f1db22218 (patch)
tree38459b2c48c90f515664fb04393dd15da1910d22
parent1a9651010aab51c9be2edeccd80e9bd11f5177ce (diff)
downloadceph-211c5f13131e28b095a1f3b72426128f1db22218.tar.gz
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 <josh.durgin@inktank.com> Signed-off-by: Yehuda Sadeh <yehuda@inktank.com> (cherry picked from commit 9a551296e0811f2b65972377b25bb28dbb42f575)
-rw-r--r--src/rgw/rgw_op.cc2
-rw-r--r--src/rgw/rgw_rados.cc15
-rw-r--r--src/rgw/rgw_rados.h1
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 05db9bff782..0c2119ecf9d 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 0da6f4669bf..ef98ec1f9fb 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() {}