From: Yehuda Sadeh Date: Thu, 24 Aug 2017 11:21:54 +0000 (-0700) Subject: rgw: add api to finish streaming writes X-Git-Tag: v13.1.0~270^2~98 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7159a65e299cbbb139c1ba85fdc0624753b779c3;p=ceph.git rgw: add api to finish streaming writes Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_rest_client.cc b/src/rgw/rgw_rest_client.cc index 20e614adf61a..d317f891a6ba 100644 --- a/src/rgw/rgw_rest_client.cc +++ b/src/rgw/rgw_rest_client.cc @@ -786,6 +786,11 @@ int RGWRESTStreamRWRequest::receive_data(void *ptr, size_t len) return len; } +void RGWRESTStreamRWRequest::set_stream_write(bool s) { + Mutex::Locker wl(write_lock); + stream_writes = s; +} + void RGWRESTStreamRWRequest::add_send_data(bufferlist& bl) { Mutex::Locker req_locker(get_req_lock()); @@ -794,12 +799,22 @@ void RGWRESTStreamRWRequest::add_send_data(bufferlist& bl) _set_write_paused(false); } +void RGWRESTStreamRWRequest::finish_write() +{ + Mutex::Locker req_locker(get_req_lock()); + Mutex::Locker wl(write_lock); + write_stream_complete = true; + _set_write_paused(false); +} + int RGWRESTStreamRWRequest::send_data(void *ptr, size_t len, bool *pause) { Mutex::Locker wl(write_lock); if (outbl.length() == 0) { - *pause = true; + if (stream_writes && !write_stream_complete) { + *pause = true; + } return 0; } diff --git a/src/rgw/rgw_rest_client.h b/src/rgw/rgw_rest_client.h index bf64a03f39ad..09f98532432c 100644 --- a/src/rgw/rgw_rest_client.h +++ b/src/rgw/rgw_rest_client.h @@ -94,6 +94,8 @@ class RGWRESTStreamRWRequest : public RGWRESTSimpleRequest { const char *method; uint64_t write_ofs{0}; bool send_paused{false}; + bool stream_writes{false}; + bool write_stream_complete{false}; protected: int handle_header(const string& name, const string& val) override; public: @@ -117,6 +119,11 @@ public: void set_in_cb(RGWGetDataCB *_cb) { cb = _cb; } void add_send_data(bufferlist& bl); + + void set_stream_write(bool s); + + /* finish streaming writes */ + void finish_write(); }; class RGWRESTStreamReadRequest : public RGWRESTStreamRWRequest {