Hello,
I can confirm there's a fd leak in some conditions in the proxy handler.
When the keep-alive time arrives in the proxified application, the
socket it's closed in the proxified application. Cherokee keeps this
connection cached to reuse it in next calls (as expected).
A new request arrives, and then cherokee_socket_is_connected gets a
ret_deny error, sets respined to true and tries to reconnect.
The problem is the socket is cleaned *before* closing, thus the close
call does nothing and we have a fd leak :(
I've repeated the fdtest [1] with the attached patch applied (it's just
swapping the clean and close calls in the reconnection with respin
enabled :D).
Before the patch:
URL: ***, Loops: 100 -- FD Before: 79, After: 177, Diff: 98
After the patch:
URL: ***, Loops: 100 -- FD Before: 15, After: 14, Diff: -1
Keep in mind that the site it's in production, so the test results can
have some noise.
Although the change seems pretty obvious, I'm newbie with the code. The
test confirms the patch, though.
Regards,
Juanjo
[1]: http://gist.github.com/281767
El mié, 20-01-2010 a las 12:09 +0100, Juan J. Martínez escribió:
> El mié, 20-01-2010 a las 11:07 +0100, Alvaro Lopez Ortega escribió:
> > [...]
> > But before I continue speculating, it'd be important to know whether the
> > leak actually exist. Does making a hundred thousand requests to the proxy
> > make any difference? Are more descriptors being left opened?
>
> I'd have liked to peep in the proxy code, but I haven't had the time
> yet :(
>
> Anyway, I did a test following the steps to reproduce the problem:
>
> 1. Get a URL through the proxy
> 2. Wait for timeout
> 3. Go to 1
>
> The script for the test is here: http://gist.github.com/281767
>
> At the end it shows the difference in open fds according to fstat
> (lsof), and my results for 100 loops are:
>
> URL: ***, Loops: 100 -- FD Before: 79, After: 177, Diff: 98
>
> It can be easily ported to Linux using lsof instead of fstat.
>
> Please notice that the server it's in production, so the results may
> have some noise for real requests (but not very much, because it's a
> very low traffic site).
>
> I don't know if that's OK, or it's related to some dark behavior in
> OpenBSD, or if I'm totally wrong :D
>
> Regards,
>
> Juanjo
>
--
jjm's home: http://www.usebox.net/jjm/
blackshell: http://blackshell.usebox.net/
ramble on: http://rambleon.usebox.net/
Index: cherokee/handler_proxy.c
===================================================================
--- cherokee/handler_proxy.c (revisión: 4158)
+++ cherokee/handler_proxy.c (copia de trabajo)
@@ -717,8 +717,8 @@
/* Configure if respinned
*/
if (hdl->respinned) {
+ cherokee_socket_close (&hdl->pconn->socket);
cherokee_socket_clean (&hdl->pconn->socket);
- cherokee_socket_close (&hdl->pconn->socket);
}
if (! cherokee_socket_configured (&hdl->pconn->socket))
_______________________________________________
Cherokee mailing list
[email protected]
http://lists.octality.com/listinfo/cherokee