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);
> }
> }
>
>