From: Liu Yuan <tailai.ly at taobao.com> Signed-off-by: Liu Yuan <tailai.ly at taobao.com> --- sheep/group.c | 51 +++++++++++++++++---------------------------------- 1 files changed, 17 insertions(+), 34 deletions(-) diff --git a/sheep/group.c b/sheep/group.c index 1e840c8..658bef8 100644 --- a/sheep/group.c +++ b/sheep/group.c @@ -23,10 +23,7 @@ #include "logger.h" #include "work.h" #include "cluster.h" -#include "coroutine.h" -static int cdrv_fd; -static struct coroutine *cdrv_co; extern struct store_driver *sd_store; extern char *obj_path; @@ -260,21 +257,22 @@ void do_cluster_request(struct work *work) free(msg); } -static void group_handler(int listen_fd, int events, void *data); - -static void cluster_dispatch(void *opaque) -{ - if (sys->cdrv->dispatch() != 0) - panic("oops... an error occurred inside corosync\n"); -} - static void group_handler(int listen_fd, int events, void *data) { - if (events & EPOLLHUP) - panic("received EPOLLHUP event: has corosync exited?\n"); + int ret; + if (events & EPOLLHUP) { + eprintf("received EPOLLHUP event: has corosync exited?\n"); + goto out; + } - cdrv_co = coroutine_create(cluster_dispatch); - coroutine_enter(cdrv_co, NULL); + ret = sys->cdrv->dispatch(); + if (ret == 0) + return; + else + eprintf("oops... an error occurred inside corosync\n"); +out: + log_close(); + exit(1); } static inline int get_nodes_nr_from(struct list_head *l) @@ -673,10 +671,6 @@ static void sd_notify_handler(struct sd_node *sender, list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings); start_cpg_event_work(); - - unregister_event(cdrv_fd); - coroutine_yield(); - register_event(cdrv_fd, group_handler, NULL); } /* @@ -970,8 +964,6 @@ static void cpg_event_done(struct work *work) cpg_event_free(cevent); cpg_event_running = 0; - coroutine_enter(cdrv_co, NULL); - if (!list_empty(&sys->cpg_event_siblings)) start_cpg_event_work(); } @@ -1254,11 +1246,6 @@ static void sd_join_handler(struct sd_node *joined, list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings); start_cpg_event_work(); - - unregister_event(cdrv_fd); - coroutine_yield(); - register_event(cdrv_fd, group_handler, NULL); - break; case CJ_RES_FAIL: case CJ_RES_JOIN_LATER: @@ -1376,10 +1363,6 @@ static void sd_leave_handler(struct sd_node *left, list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings); start_cpg_event_work(); - unregister_event(cdrv_fd); - coroutine_yield(); - register_event(cdrv_fd, group_handler, NULL); - return; oom: if (w) { @@ -1392,7 +1375,7 @@ oom: int create_cluster(int port, int64_t zone, int nr_vnodes) { - int ret; + int fd, ret; struct cdrv_handlers handlers = { .join_handler = sd_join_handler, .leave_handler = sd_leave_handler, @@ -1410,8 +1393,8 @@ int create_cluster(int port, int64_t zone, int nr_vnodes) } } - cdrv_fd = sys->cdrv->init(&handlers, sys->cdrv_option, sys->this_node.addr); - if (cdrv_fd < 0) + fd = sys->cdrv->init(&handlers, sys->cdrv_option, sys->this_node.addr); + if (fd < 0) return -1; sys->this_node.port = port; @@ -1438,7 +1421,7 @@ int create_cluster(int port, int64_t zone, int nr_vnodes) INIT_LIST_HEAD(&sys->cpg_event_siblings); - ret = register_event(cdrv_fd, group_handler, NULL); + ret = register_event(fd, group_handler, NULL); if (ret) { eprintf("failed to register epoll events (%d)\n", ret); return 1; -- 1.7.8.2 |