From: Liu Yuan <[email protected]>

Signed-off-by: Liu Yuan <[email protected]>
---
 sheep/group.c |   51 +++++++++++++++++----------------------------------
 1 files changed, 17 insertions(+), 34 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index dda468c..5206f24 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)
@@ -671,10 +669,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();
 }
@@ -1246,11 +1238,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:
@@ -1368,10 +1355,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) {
@@ -1384,7 +1367,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,
@@ -1402,8 +1385,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;
@@ -1430,7 +1413,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

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to