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: v10.2.6~36^2~29^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0330031f634b9ee7b59d05276e2cb550994f85a6;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 (cherry picked from commit 75897f82abde818fde6e1625c6977dcdd639a1f0) --- diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 1661dd2f2ba..1212bb0b876 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -393,8 +393,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 */