]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: use non-blocking reads for clear_signal
authorCasey Bodley <cbodley@redhat.com>
Fri, 9 Sep 2016 20:01:16 +0000 (16:01 -0400)
committerCasey Bodley <cbodley@redhat.com>
Mon, 12 Sep 2016 15:40:17 +0000 (11:40 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_http_client.cc

index 97e146b78dbbc76c967d7670d33f927b6740b501..a83140bf50992190dc7d4ae40161d7d037bc1cc5 100644 (file)
@@ -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<char, 256> 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");