Client abort detection w/ upstream broken on anything but kqueue ()?

Marcello Barnaba marcello.barnaba at
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?

Thank you,

~ marcello.barnaba at

More information about the nginx mailing list