From 1101fcc750cdd8702b2ca570da2cecb47d0ddeae Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Fri, 9 Sep 2016 16:01:16 -0400 Subject: [PATCH] rgw: use non-blocking reads for clear_signal Signed-off-by: Casey Bodley --- src/rgw/rgw_http_client.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 97e146b78dbbc..a83140bf50992 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -420,10 +420,13 @@ int RGWHTTPTransceiver::send_data(void* ptr, size_t len) static int clear_signal(int fd) { - uint32_t buf; - int ret = ::read(fd, (void *)&buf, sizeof(buf)); + // since we're in non-blocking mode, we can try to read a lot more than + // one signal from signal_thread() to avoid later wakeups + std::array buf; + int ret = ::read(fd, (void *)buf.data(), buf.size()); if (ret < 0) { - return -errno; + ret = -errno; + return ret == -EAGAIN ? 0 : ret; // clear EAGAIN } return 0; } @@ -797,6 +800,16 @@ int RGWHTTPManager::set_threaded() return r; } + // enable non-blocking reads + r = ::fcntl(thread_pipe[0], F_SETFL, O_NONBLOCK); + if (r < 0) { + r = -errno; + ldout(cct, 0) << "ERROR: fcntl() returned errno=" << r << dendl; + TEMP_FAILURE_RETRY(::close(thread_pipe[0])); + TEMP_FAILURE_RETRY(::close(thread_pipe[1])); + return r; + } + is_threaded = true; reqs_thread = new ReqsThread(this); reqs_thread->create("http_manager"); -- 2.39.5