]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: beast frontend uses yield_context to read/write body
authorCasey Bodley <cbodley@redhat.com>
Sat, 2 Dec 2017 05:27:35 +0000 (00:27 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 25 Apr 2019 22:37:39 +0000 (18:37 -0400)
uses async_write and async_read_some to yield the coroutine during
frontend io

Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_asio_frontend.cc

index e4be074ec74f8342ccedda59b3c735738553991f..ed724ed4234b03fc09480c7adb0a5d1bf665ad9a 100644 (file)
@@ -36,19 +36,22 @@ template <typename Stream>
 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()};