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());
_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;
}
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:
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 {