From: Casey Bodley Date: Fri, 9 Sep 2016 20:01:16 +0000 (-0400) Subject: rgw: use non-blocking reads for clear_signal X-Git-Tag: v10.2.6~36^2~29^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3881444c75cdf32b62caad1ca1c723b449a57c2c;p=ceph.git rgw: use non-blocking reads for clear_signal Signed-off-by: Casey Bodley (cherry picked from commit 1101fcc750cdd8702b2ca570da2cecb47d0ddeae) --- diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 04ffd18a2feb2..2fa5c91140bca 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -346,10 +346,13 @@ RGWHTTPClient::~RGWHTTPClient() 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; } @@ -723,6 +726,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");