Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev ][Date Next ][Thread Prev ][Thread Next ][Date Index ][Thread Index ]
Re: worker process 7035 exited on signal 11 (core dumped)
On Wed, Aug 29, 2007 at 11:55:30AM +0400, Igor Sysoev wrote:
> > Кстати, в вышеупомянутой проверке на NULL я буду вызывать DP_ISPOLLED,
> > чтобы проверить, дейстивтельно ядро считает, что дескрптор ещё присутствует
> > в /dev/poll, или же это фантомные события, оставшиеся после удаления.
>
> Патч, который проверяет с DP_ISPOLLED странный дескриптор.
> Падать теперь не должно, в логе должны быть alert'ы.
> Можно поставить в продакшн плюс на тестирование с отладочным логом для
> выяснения, кто не прав.
Патч забыл.
--
Игорь Сысоев
http://sysoev.ru
Index: src/event/modules/ngx_devpoll_module.c
===================================================================
--- src/event/modules/ngx_devpoll_module.c (revision 750)
+++ src/event/modules/ngx_devpoll_module.c (working copy)
@@ -13,8 +13,9 @@
/* Solaris declarations */
-#define POLLREMOVE 0x0800
-#define DP_POLL 0xD001
+#define POLLREMOVE 0x0800
+#define DP_POLL 0xD001
+#define DP_ISPOLLED 0xD002
struct dvpoll {
struct pollfd *dp_fds;
@@ -255,10 +256,16 @@
ev->active = 0;
if (flags & NGX_CLOSE_EVENT) {
+ e = (event == POLLIN) ? c->write : c->read;
+
+ if (e) {
+ e->active = 0;
+ }
+
return NGX_OK;
}
- /* restore the paired event if it exists */
+ /* restore the pair event if it exists */
if (event == POLLIN) {
e = c->write;
@@ -330,13 +337,14 @@
ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
ngx_uint_t flags)
{
- int events, revents;
+ int events, revents, rc;
size_t n;
ngx_err_t err;
ngx_int_t i;
ngx_uint_t level;
ngx_event_t *rev, *wev, **queue;
ngx_connection_t *c;
+ struct pollfd pfd;
struct dvpoll dvp;
/* NGX_TIMER_INFINITE == INFTIM */
@@ -403,17 +411,53 @@
for (i = 0; i < events; i++) {
c = ngx_cycle->files[event_list[i].fd];
- if (c->fd == -1) {
- if (c->read->closed) {
- continue;
+ revents = event_list[i].revents;
+
+ if (c == NULL || c->fd == -1) {
+
+ pfd.fd = event_list[i].fd;
+ pfd.events = 0;
+ pfd.revents = 0;
+
+ rc = ioctl(dp, DP_ISPOLLED, &pfd);
+
+ switch (rc) {
+
+ case -1:
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+ "ioctl(DP_ISPOLLED) failed for socket %d, event",
+ event_list[i].fd, revents);
+ break;
+
+ case 0:
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+ "phantom event %04Xd for closed and removed socket %d",
+ revents, event_list[i].fd);
+ break;
+
+ default:
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+ "unexpected event %04Xd for closed and removed socket %d,
",
+ "ioctl(DP_ISPOLLED) returned rc:%d, fd:%d, event %04Xd",
+ revents, event_list[i].fd, rc, pfd.fd, pfd.revents);
+
+ pfd.fd = event_list[i].fd;
+ pfd.events = POLLREMOVE;
+ pfd.revents = 0;
+
+ if (write(dp, &pfd, sizeof(struct pollfd))
+ != (ssize_t) sizeof(struct pollfd))
+ {
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+ "forced write(/dev/poll) failed");
+ }
+
+ break;
}
- ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event");
continue;
}
- revents = event_list[i].revents;
-
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"devpoll: fd:%d, ev:%04Xd, rev:%04Xd",
event_list[i].fd, event_list[i].events, revents);