[Dovecot] Fix for the kevent "Unrecognized event" problem.

John Wong johnw at wonghome.net
Thu May 11 14:36:36 EEST 2006


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



More information about the dovecot mailing list