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 <cbodley@redhat.com>
This commit is contained in:
Casey Bodley 2016-06-16 22:51:54 -04:00
parent b8b339c10a
commit 75897f82ab

View File

@ -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 */