[sheepdog] [PATCH] zookeeper: add zk_connect()

Ruoyu liangry at ucweb.com
Mon Mar 2 12:35:50 CET 2015


Applied, thanks.

On 2015年03月02日 17:29, Liu Yuan wrote:
> From: Liu Yuan <liuyuan at cmss.chinamobile.com>
>
> This can reduce duplicated codes into a single function. Also add one comment
> for why we call zookeeper_init() twice.
>
> Signed-off-by: Liu Yuan <liuyuan at cmss.chinamobile.com>
> ---
>   sheep/cluster/zookeeper.c | 63 ++++++++++++++++++++++-------------------------
>   1 file changed, 30 insertions(+), 33 deletions(-)
>
> diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
> index 9dace4f..4f85043 100644
> --- a/sheep/cluster/zookeeper.c
> +++ b/sheep/cluster/zookeeper.c
> @@ -1377,12 +1377,36 @@ static void zk_unlock(uint64_t lock_id)
>   	sd_debug("unlock %"PRIu64, lock_id);
>   }
>   
> +static int zk_connect(const char *host, watcher_fn watcher, int timeout)
> +{
> +	int interval, max_retry, retry;
> +
> +	zhandle = zookeeper_init(host, watcher, timeout, NULL, NULL, 0);
> +
> +	if (!zhandle) {
> +		sd_err("failed to initialize zk server %s", host);
> +		return -1;
> +	}
> +
> +	interval = 100;
> +	retry = 0;
> +	max_retry = timeout / interval;
> +	while (zoo_state(zhandle) != ZOO_CONNECTED_STATE) {
> +		usleep(interval * 1000);
> +		if (++retry >= max_retry) {
> +			sd_err("failed to connect to zk server %s "
> +					"after %d retries", host, retry);
> +			return -1;
> +		}
> +	}
> +	return 0;
> +}
> +
>   static int zk_prepare_root(const char *hosts)
>   {
>   	char root[MAX_NODE_STR_LEN];
>   	char conn[MAX_NODE_STR_LEN];
>   	const char *p = strchr(hosts, '/');
> -	int interval, max_retry, retry;
>   	int i = 0;
>   	if (p) {
>   		if (strlen(p) >= MAX_NODE_STR_LEN) {
> @@ -1405,25 +1429,13 @@ static int zk_prepare_root(const char *hosts)
>   			strcpy(conn, hosts);
>   	}
>   
> -	zhandle = zookeeper_init(conn, zk_watcher, zk_timeout, NULL, NULL, 0);
> -	if (!zhandle) {
> -		sd_err("failed to initialize zk server %s", conn);
> +	if (zk_connect(conn, zk_watcher, zk_timeout) < 0)
>   		return -1;
> -	}
>   
> -	interval = 100;
> -	retry = 0;
> -	max_retry = zk_timeout / interval;
> -	while (zoo_state(zhandle) != ZOO_CONNECTED_STATE) {
> -		usleep(interval * 1000);
> -		if (++retry >= max_retry) {
> -			sd_err("failed to connect to zk server %s "
> -					"after %d retries", conn, retry);
> -			return -1;
> -		}
> -	}
>   	sd_debug("sheepdog cluster_id %s", root);
>   	RETURN_IF_ERROR(zk_init_node(root), "path %s", root);
> +
> +	/* We need to close(zhandle) because we might chroot later */
>   	zookeeper_close(zhandle);
>   	return 0;
>   }
> @@ -1431,7 +1443,7 @@ static int zk_prepare_root(const char *hosts)
>   static int zk_init(const char *option)
>   {
>   	char *hosts, *to, *p;
> -	int ret, interval, retry = 0, max_retry, timeo;
> +	int ret, timeo;
>   
>   	if (!option) {
>   		sd_err("You must specify zookeeper servers.");
> @@ -1454,23 +1466,8 @@ static int zk_init(const char *option)
>   
>   	sd_info("version %d.%d.%d, address %s, timeout %d", ZOO_MAJOR_VERSION,
>   		ZOO_MINOR_VERSION, ZOO_PATCH_VERSION, hosts, zk_timeout);
> -	zhandle = zookeeper_init(hosts, zk_watcher, zk_timeout, NULL, NULL, 0);
> -	if (!zhandle) {
> -		sd_err("failed to initialize zk server %s", option);
> +	if (zk_connect(hosts, zk_watcher, zk_timeout) < 0)
>   		return -1;
> -	}
> -
> -	/* the simplest way to wait and check zk connection */
> -	interval = 100;
> -	max_retry = zk_timeout / interval;
> -	while (zoo_state(zhandle) != ZOO_CONNECTED_STATE) {
> -		usleep(interval * 1000);
> -		if (++retry >= max_retry) {
> -			sd_err("failed to connect to zk server %s "
> -					"after %d retries", option, retry);
> -			return -1;
> -		}
> -	}
>   
>   	timeo = zoo_recv_timeout(zhandle);
>   	sd_info("the negociated session timeout is %d", timeo);





More information about the sheepdog mailing list