[Sheepdog] [zookeeper][PATCH v2 10/11] Fix bug: leave event lost in zookeeper driver
Yunkai Zhang
yunkai.me at gmail.com
Thu Apr 26 17:21:29 CEST 2012
From: Yunkai Zhang <qiushu.zyk at taobao.com>
If one sheep joined and left too quickly,
it may lead to leave event lost.
Signed-off-by: Yunkai Zhang <qiushu.zyk at taobao.com>
---
sheep/cluster/zookeeper.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index 3ec64a8..8999131 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -14,7 +14,6 @@
#include <netdb.h>
#include <search.h>
#include <assert.h>
-#include <pthread.h>
#include <sys/eventfd.h>
#include <zookeeper/zookeeper.h>
@@ -882,9 +881,15 @@ static int zk_dispatch(void)
dprintf("one sheep joined[down], nr_nodes:%ld, sender:%s, joined:%d\n",
nr_zk_nodes, node_to_str(&ev.sender.node), ev.sender.joined);
- sprintf(path, MEMBER_ZNODE "/%s", node_to_str(&ev.sender.node));
- rc = zk_exists(zhandle, path, 1, NULL);
- dprintf("watch path:%s, exists:%d\n", path, (rc==ZOK));
+ if (ev.join_result == CJ_RES_SUCCESS) {
+ sprintf(path, MEMBER_ZNODE "/%s", node_to_str(&ev.sender.node));
+ rc = zk_exists(zhandle, path, 1, NULL);
+ dprintf("watch path:%s, exists:%d\n", path, (rc==ZOK));
+ if (rc != ZOK) {
+ dprintf("sender have left:%s\n", node_to_str(&ev.sender.node));
+ add_event(zhandle, EVENT_LEAVE, &ev.sender, NULL, 0, NULL);
+ }
+ }
build_node_list(zk_nodes, nr_zk_nodes, entries);
sd_join_handler(&ev.sender.node, entries, nr_zk_nodes,
--
1.7.7.6
More information about the sheepdog
mailing list