Václav Haisman
2006-May-09 19:45 UTC
[Dovecot] Fix for the kevent "Unrecognized event" problem.
The attached patch should fix the problem with dying imap on "Unrecognized event". The problem is that when we register a handle for IO_ERROR only, we still can get readable/writable event without EV_EOF being set. This case was not handled. -- Vaclav Haisman -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: io-kq.diff URL: <http://dovecot.org/pipermail/dovecot/attachments/20060509/023b4df1/attachment.pl> -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 544 bytes Desc: OpenPGP digital signature URL: <http://dovecot.org/pipermail/dovecot/attachments/20060509/023b4df1/attachment.bin>
Václav Haisman
2006-May-10 09:50 UTC
[Dovecot] Fix for the kevent "Unrecognized event" problem.
V?clav Haisman wrote:> The attached patch should fix the problem with dying imap on > "Unrecognized event". The problem is that when we register a handle for > IO_ERROR only, we still can get readable/writable event without EV_EOF > being set. This case was not handled. > > -- > Vaclav HaismanThe fix uncovered another related glitch. If we are waiting just on IO_ERROR then we get readable/writable event all the time, because kqueue is level triggered by default and the codition is always present, and the result is busy loop. Adding EV_CLEAR bit in this case should fix it. -- Vaclav Haisman -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: io-kq.diff URL: <http://dovecot.org/pipermail/dovecot/attachments/20060510/8345e515/attachment.pl> -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 544 bytes Desc: OpenPGP digital signature URL: <http://dovecot.org/pipermail/dovecot/attachments/20060510/8345e515/attachment.bin>
John Wong
2006-May-11 11:36 UTC
[Dovecot] Fix for the kevent "Unrecognized event" problem.
i use openbsd/i386 + dovecot-cvs(10-may) + this patch, my maillog still have kqueue error message like this: Unrecognized event: kevent {.ident = 0, .filter = 0xffffffff, .flags = 0x8001, .fflags = 0x00000000, .data = 0x00000000} thank you V?clav Haisman wrote:> The attached patch should fix the problem with dying imap on > "Unrecognized event". The problem is that when we register a handle for > IO_ERROR only, we still can get readable/writable event without EV_EOF > being set. This case was not handled. > > -- > Vaclav Haisman > > ------------------------------------------------------------------------ > > *** ioloop-kqueue.c.~1.4.~ Tue May 2 14:36:56 2006 > --- ioloop-kqueue.c Tue May 9 21:29:33 2006 > *************** > *** 74,80 **** > { > struct ioloop_handler_context *ctx = ioloop->handler_context; > const int fd = io->fd; > ! struct kevent ev = { fd, 0, EV_ADD | EV_EOF, 0, 0, NULL }; > enum io_condition condition = io->condition & MASK; > > i_assert(io->callback != NULL); > --- 74,80 ---- > { > struct ioloop_handler_context *ctx = ioloop->handler_context; > const int fd = io->fd; > ! struct kevent ev = { fd, 0, EV_ADD, 0, 0, NULL }; > enum io_condition condition = io->condition & MASK; > > i_assert(io->callback != NULL); > *************** > *** 184,190 **** > > i_assert(ctx->evbuf[i].ident < ctx->fds_size); > if ((ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) && > ! (ctx->evbuf[i].flags & EV_EOF)) { > struct io *errio = ctx->fds[ctx->evbuf[i].ident].errio; > > t_id = t_push(); > --- 184,190 ---- > > i_assert(ctx->evbuf[i].ident < ctx->fds_size); > if ((ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) && > ! (ctx->evbuf[i].flags & (EV_EOF | EV_ERROR))) { > struct io *errio = ctx->fds[ctx->evbuf[i].ident].errio; > > t_id = t_push(); > *************** > *** 203,216 **** > " in I/O handler %p", > (void *)io->callback); > } > } else > i_panic("Unrecognized event: kevent {.ident = %u," > " .filter = 0x%04x," > " .flags = 0x%04x," > " .fflags = 0x%08x," > ! " .data = 0x%08x}", ctx->evbuf[i].ident, > ctx->evbuf[i].filter, ctx->evbuf[i].flags, > ! ctx->evbuf[i].fflags, ctx->evbuf[i].data); > } > } > > --- 203,224 ---- > " in I/O handler %p", > (void *)io->callback); > } > + } else if (ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) { > + /* > + NO-OP. If the handle is registered only for > + IO_ERROR, then we can get readable/writable event > + but no IO_READ | IO_WRITE set. > + */ > } else > i_panic("Unrecognized event: kevent {.ident = %u," > " .filter = 0x%04x," > " .flags = 0x%04x," > " .fflags = 0x%08x," > ! " .data = 0x%08x}\n" > ! "mode: 0x%x04x", ctx->evbuf[i].ident, > ctx->evbuf[i].filter, ctx->evbuf[i].flags, > ! ctx->evbuf[i].fflags, ctx->evbuf[i].data, > ! ctx->fds[ctx->evbuf[i].ident].mode); > } > } > >