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