Currently, the local driver doesn't retry performing the blocked events after they are unblocked. This patch fixes the problem.
Signed-off-by: MORITA Kazutaka <[email protected]> --- sheep/cluster/local.c | 50 ++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/sheep/cluster/local.c b/sheep/cluster/local.c index 0fc2f89..66a53c3 100644 --- a/sheep/cluster/local.c +++ b/sheep/cluster/local.c @@ -340,29 +340,17 @@ static void local_unblock(void *msg, size_t msg_len) shm_queue_unlock(); } -static void local_handler(int listen_fd, int events, void *data) +/* + * Returns true if an event is processed + */ +static bool local_process_event(void) { - struct signalfd_siginfo siginfo; struct local_event *ev; enum cluster_join_result res; - int ret; - - if (events & EPOLLHUP) { - eprintf("local driver received EPOLLHUP event, exiting.\n"); - log_close(); - exit(1); - } - - dprintf("read siginfo\n"); - - ret = read(sigfd, &siginfo, sizeof(siginfo)); - assert(ret == sizeof(siginfo)); - - shm_queue_lock(); ev = shm_queue_peek(); if (!ev) - goto out; + return false; switch (ev->type) { case EVENT_JOIN_REQUEST: @@ -403,7 +391,8 @@ static void local_handler(int listen_fd, int events, void *data) shm_queue_pop(); break; case EVENT_BLOCK: - sd_block_handler(&ev->sender); + if (!sd_block_handler(&ev->sender)) + return false; break; case EVENT_NOTIFY: sd_notify_handler(&ev->sender, ev->buf, ev->buf_len); @@ -411,7 +400,30 @@ static void local_handler(int listen_fd, int events, void *data) break; } -out: + return true; +} + +static void local_handler(int listen_fd, int events, void *data) +{ + struct signalfd_siginfo siginfo; + int ret; + + if (events & EPOLLHUP) { + eprintf("local driver received EPOLLHUP event, exiting.\n"); + log_close(); + exit(1); + } + + dprintf("read siginfo\n"); + + ret = read(sigfd, &siginfo, sizeof(siginfo)); + assert(ret == sizeof(siginfo)); + + shm_queue_lock(); + + while (local_process_event()) + ; + shm_queue_unlock(); } -- 1.7.9.5 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
