Mercurial > hg > nginx
comparison src/event/modules/ngx_devpoll_module.c @ 5170:6362bd26e4b0
Events: protection from stale events in eventport and devpoll.
Stale write event may happen if read and write events was reported both,
and processing of the read event closed descriptor.
In practice this might result in "sendfilev() failed (134: ..." or
"writev() failed (134: ..." errors when switching to next upstream server.
See report here:
http://mailman.nginx.org/pipermail/nginx/2013-April/038421.html
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Fri, 12 Apr 2013 15:02:33 +0000 |
parents | d620f497c50f |
children | a4d21534cbf4 |
comparison
equal
deleted
inserted
replaced
5169:f6bbe77794aa | 5170:6362bd26e4b0 |
---|---|
341 int events, revents, rc; | 341 int events, revents, rc; |
342 size_t n; | 342 size_t n; |
343 ngx_fd_t fd; | 343 ngx_fd_t fd; |
344 ngx_err_t err; | 344 ngx_err_t err; |
345 ngx_int_t i; | 345 ngx_int_t i; |
346 ngx_uint_t level; | 346 ngx_uint_t level, instance; |
347 ngx_event_t *rev, *wev, **queue; | 347 ngx_event_t *rev, *wev, **queue; |
348 ngx_connection_t *c; | 348 ngx_connection_t *c; |
349 struct pollfd pfd; | 349 struct pollfd pfd; |
350 struct dvpoll dvp; | 350 struct dvpoll dvp; |
351 | 351 |
508 &ngx_posted_accept_events : &ngx_posted_events); | 508 &ngx_posted_accept_events : &ngx_posted_events); |
509 | 509 |
510 ngx_locked_post_event(rev, queue); | 510 ngx_locked_post_event(rev, queue); |
511 | 511 |
512 } else { | 512 } else { |
513 instance = rev->instance; | |
514 | |
513 rev->handler(rev); | 515 rev->handler(rev); |
516 | |
517 if (c->fd == -1 || wev->instance != instance) { | |
518 continue; | |
519 } | |
514 } | 520 } |
515 } | 521 } |
516 | 522 |
517 wev = c->write; | 523 wev = c->write; |
518 | 524 |