From 8c63c8d19d6dec0a40f4b2cfd6445a663e9ccadf Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 10 Sep 2013 12:18:55 -0700 Subject: rgw: drain pending requests before completing write Fixes: #6268 When doing aio write of objects (either regular or multipart parts) we need to drain pending aio requests. Otherwise if gateway goes down then object might end up corrupted. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_rados.cc | 5 +++++ src/rgw/rgw_rados.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 0c2119ecf9d..d79fbe4c943 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -761,6 +761,11 @@ int RGWPutObjProcessor_Atomic::complete_writing_data() } } complete_parts(); + + int r = drain_pending(); + if (r < 0) + return r; + return 0; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index ef98ec1f9fb..a55f1c1f94c 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -238,11 +238,11 @@ class RGWPutObjProcessor_Aio : public RGWPutObjProcessor struct put_obj_aio_info pop_pending(); int wait_pending_front(); bool pending_has_completed(); - int drain_pending(); protected: uint64_t obj_len; + int drain_pending(); int handle_obj_data(rgw_obj& obj, bufferlist& bl, off_t ofs, off_t abs_ofs, void **phandle); public: -- cgit v1.2.1