[sheepdog] [PATCH] zk: wait for session timeout if previous zk path exists at startup

Kai Zhang kyle at zelin.io
Thu May 30 04:06:28 CEST 2013


Signed-off-by: Kai Zhang <kyle at zelin.io>
---
 sheep/cluster/zookeeper.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index 5f5e867..d144fa7 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -491,7 +491,7 @@ static int add_join_event(void *msg, size_t msg_len)
 static int zk_join(const struct sd_node *myself,
 		   void *opaque, size_t opaque_len)
 {
-	int rc;
+	int rc, sleep_ms;
 	char path[MAX_NODE_STR_LEN];
 
 	this_node.node = *myself;
@@ -499,8 +499,15 @@ static int zk_join(const struct sd_node *myself,
 	snprintf(path, sizeof(path), MEMBER_ZNODE "/%s", node_to_str(myself));
 	rc = zk_node_exists(path);
 	if (rc == ZOK) {
-		sd_eprintf("Previous zookeeper session exist, shoot myself.");
-		exit(1);
+		/* wait for previous session timeout */
+		sleep_ms = zoo_recv_timeout(zhandle);
+		usleep(sleep_ms * 1000);
+		rc = zk_node_exists(path);
+		if (rc == ZOK) {
+			sd_eprintf("Previous zookeeper session exist,"
+				   " shoot myself.");
+			exit(1);
+		}
 	}
 
 	/* For concurrent nodes setup, we allow only one to continue */
-- 
1.7.1




More information about the sheepdog mailing list