From: Casey Bodley Date: Sat, 2 Dec 2017 05:27:35 +0000 (-0500) Subject: rgw: beast frontend uses yield_context to read/write body X-Git-Tag: v15.1.0~2699^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=dd4350ba11631ddc59ec435a4e3634865d506498;p=ceph-ci.git rgw: beast frontend uses yield_context to read/write body uses async_write and async_read_some to yield the coroutine during frontend io Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_asio_frontend.cc b/src/rgw/rgw_asio_frontend.cc index e4be074ec74..ed724ed4234 100644 --- a/src/rgw/rgw_asio_frontend.cc +++ b/src/rgw/rgw_asio_frontend.cc @@ -36,19 +36,22 @@ template class StreamIO : public rgw::asio::ClientIO { CephContext* const cct; Stream& stream; + boost::asio::yield_context yield; boost::beast::flat_buffer& buffer; public: StreamIO(CephContext *cct, Stream& stream, rgw::asio::parser_type& parser, + boost::asio::yield_context yield, boost::beast::flat_buffer& buffer, bool is_ssl, const tcp::endpoint& local_endpoint, const tcp::endpoint& remote_endpoint) : ClientIO(parser, is_ssl, local_endpoint, remote_endpoint), - cct(cct), stream(stream), buffer(buffer) + cct(cct), stream(stream), yield(yield), buffer(buffer) {} size_t write_data(const char* buf, size_t len) override { boost::system::error_code ec; - auto bytes = boost::asio::write(stream, boost::asio::buffer(buf, len), ec); + auto bytes = boost::asio::async_write(stream, boost::asio::buffer(buf, len), + yield[ec]); if (ec) { ldout(cct, 4) << "write_data failed: " << ec.message() << dendl; throw rgw::io::Exception(ec.value(), std::system_category()); @@ -64,7 +67,7 @@ class StreamIO : public rgw::asio::ClientIO { while (body_remaining.size && !parser.is_done()) { boost::system::error_code ec; - http::read_some(stream, buffer, parser, ec); + http::async_read_some(stream, buffer, parser, yield[ec]); if (ec == http::error::partial_message || ec == http::error::need_buffer) { break; @@ -142,7 +145,7 @@ void handle_connection(RGWProcessEnv& env, Stream& stream, RGWRequest req{env.store->get_new_req_id()}; auto& socket = stream.lowest_layer(); - StreamIO real_client{cct, stream, parser, buffer, is_ssl, + StreamIO real_client{cct, stream, parser, yield, buffer, is_ssl, socket.local_endpoint(), socket.remote_endpoint()};