Client abort detection w/ upstream broken on anything but kqueue ()?
marcello.barnaba at gmail.com
Wed Nov 3 00:14:34 MSK 2010
I'm investigating why client aborts are successfully detected
by nginx when using kqueue () on BSD systems and not when using
poll () on BSD & Linux or epoll () on Linux systems.
I've done debug sessions and I nailed down the problem to the
ngx_http_upstream_check_broken_connection function, line 917 of
http/ngx_http_upstream.c of release 0.8.53.
From my tests on a Darwin 10.4.0 using poll () and on a Linux
2.6.32 using epoll () a client that closes its socket makes the
recv () on line 994 return 1, with errno set to EWOULDBLOCK on
Darwin/poll () and to EAGAIN on Linux/epoll ().
I've tried to change the condition at line 1016 from n > 0 to
(n > 0 && err != NGX_EAGAIN && err != NGX_EWOULDBLOCK) but I'm
sure it doesn't make much sense.
Is this a known issue? From where should I start to solve it?
~ marcello.barnaba at gmail.com
More information about the nginx