return 0;
}
+int RGWStreamRWHTTPResourceCRF::drain_writes(bool *need_retry)
+{
+ reenter(&drain_state) {
+ *need_retry = true;
+ yield req->finish_write();
+ *need_retry = !req->is_done();
+ while (!req->is_done()) {
+ yield caller->io_block(0, req->get_io_id());
+ *need_retry = !req->is_done();
+ }
+ return req->get_req_retcode();
+ }
+ return 0;
+}
+
TestCR::TestCR(CephContext *_cct, RGWHTTPManager *_mgr, RGWHTTPStreamRWRequest *_req) : RGWCoroutine(_cct), cct(_cct), http_manager(_mgr),
req(_req) {}
TestCR::~TestCR() {
} while (need_retry);
if (retcode < 0) {
- dout(0) << __FILE__ << ":" << __LINE__ << " retcode=" << retcode << dendl;
return set_cr_error(ret);
}
}
if (retcode < 0) {
- dout(0) << __FILE__ << ":" << __LINE__ << " retcode=" << retcode << dendl;
return set_cr_error(ret);
}
dout(0) << "wrote " << bl.length() << " bytes" << dendl;
} while (true);
+ do {
+ yield {
+ int ret = crf->drain_writes(&need_retry);
+ if (ret < 0) {
+ return set_cr_error(ret);
+ }
+ }
+ } while (need_retry);
+
return set_cr_done();
}
return 0;
}
if (retcode < 0) {
- dout(0) << __FILE__ << ":" << __LINE__ << " retcode=" << retcode << dendl;
+ ldout(20) << __func__ << ": in_crf->read() retcode=" << retcode << dendl;
return set_cr_error(ret);
}
} while (need_retry);
}
if (retcode < 0) {
- dout(0) << __FILE__ << ":" << __LINE__ << " retcode=" << retcode << dendl;
+ ldout(20) << __func__ << ": out_crf->write() retcode=" << retcode << dendl;
return set_cr_error(ret);
}
dout(0) << "wrote " << bl.length() << " bytes" << dendl;
} while (true);
+ do {
+ yield {
+ int ret = out_crf->drain_writes(&need_retry);
+ if (ret < 0) {
+ return set_cr_error(ret);
+ }
+ }
+ } while (need_retry);
+
return set_cr_done();
}
return 0;
boost::asio::coroutine read_state;
boost::asio::coroutine write_state;
+ boost::asio::coroutine drain_state;
public:
int init();
int read(bufferlist *data, uint64_t max, bool *need_retry); /* reentrant */
int write(bufferlist& data); /* reentrant */
+ int drain_writes(bool *need_retry); /* reentrant */
};
class TestCR : public RGWCoroutine {