From da7ebab58253db0a360ec92c376962bfbef24910 Mon Sep 17 00:00:00 2001 From: Jim Garlick Date: Sun, 1 Dec 2019 15:48:14 -0800 Subject: [PATCH] libutil/ev_zmq: handle EV_ERROR on io watcher Problem: ev_zmq ignores events on its internal io watcher, so when libev raises EV_ERROR on it because something went wrong internally, nothing happens. The internal io watcher is only used for its side effect of unblocking the reactor when pollevents edge triggers from "no events" to "some events". The prep/check/idle watchers do the heavy lifting. Add a check for pending EV_ERROR events on the io watcher in the check callback. If found, notify the user via the ev_zmq watcher callback. This tracks a similar change in libflux/ev_flux.c, based on experience with an internal failure documented in #2554. --- src/common/libutil/ev_zmq.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/libutil/ev_zmq.c b/src/common/libutil/ev_zmq.c index 13218fcc10b8..055ab7af675e 100644 --- a/src/common/libutil/ev_zmq.c +++ b/src/common/libutil/ev_zmq.c @@ -64,6 +64,9 @@ static void check_cb (struct ev_loop *loop, ev_check *w, int revents) if (handle == NULL) zw->cb (loop, zw, EV_ERROR); + else if (ev_is_pending (&zw->io_w) + && ev_clear_pending (loop, &zw->io_w) & EV_ERROR) + zw->cb (loop, zw, EV_ERROR); else if (zmq_getsockopt (handle, ZMQ_EVENTS, &zevents, &zevents_size) < 0) zw->cb (loop, zw, EV_ERROR); else if ((revents = ztoe (zevents) & zw->events))