From: Casey Bodley Date: Fri, 17 Jun 2016 02:51:54 +0000 (-0400) Subject: rgw: add pipe fd to set for select() in do_curl_wait() X-Git-Tag: v11.0.0~127^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F9785%2Fhead;p=ceph.git rgw: add pipe fd to set for select() in do_curl_wait() when HAVE_CURL_MULTI_WAIT is 0, the pipe fd is never added to the readfds for select(), so FD_ISSET() is always false. this prevents us from ever trying to read from the fd, and the pipe's buffer eventually fills up and deadlocks callers of RGWHTTPManager::signal_thread() when they try to write to the pipe Fixes: http://tracker.ceph.com/issues/16368 Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 102ea60d32e7..ee1f48a44c16 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -465,8 +465,11 @@ static int do_curl_wait(CephContext *cct, CURLM *handle, int signal_fd) return -EIO; } - if (signal_fd >= maxfd) { - maxfd = signal_fd + 1; + if (signal_fd > 0) { + FD_SET(signal_fd, &fdread); + if (signal_fd >= maxfd) { + maxfd = signal_fd + 1; + } } /* forcing a strict timeout, as the returned fdsets might not reference all fds we wait on */