[sheepdog] [PATCH] sheep/zookeeper: ensure zookeeper is connected

Hitoshi Mitake mitake.hitoshi at gmail.com
Wed Jul 23 15:38:16 CEST 2014


At Wed, 23 Jul 2014 15:50:39 +0800,
Ruoyu wrote:
> 
> 
> On 2014年07月23日 12:19, Hitoshi Mitake wrote:
> > At Wed, 23 Jul 2014 12:02:10 +0800,
> > Ruoyu wrote:
> >> zookeeper session establishment is asynchronous. It means that
> >> we cannot judge the session is connected by checking the
> >> return value of the func zookeeper_init. Instead, we should
> >> check the zookeeper handler's state in a loop to ensure
> >> the session is connected.
> >>
> >> Signed-off-by: Ruoyu <liangry at ucweb.com>
> >> ---
> >>   sheep/cluster/zookeeper.c | 16 ++++++++++++++--
> >>   1 file changed, 14 insertions(+), 2 deletions(-)
> > Applied, thanks.
> >
> > It would be nice if the value of interval can be specified by user.
> Maybe keep it simple is better. If I am the user, I don't care how many 
> times sheep tries to connect zookeeper cluster. I just care whether the 
> session is connected or not during expiry.

OK, I understand.

Thanks,
Hitoshi

> >
> > Thanks,
> > Hitoshi
> >
> >> diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
> >> index 64613ca..96acce6 100644
> >> --- a/sheep/cluster/zookeeper.c
> >> +++ b/sheep/cluster/zookeeper.c
> >> @@ -1351,7 +1351,7 @@ static void zk_unlock(uint64_t lock_id)
> >>   static int zk_init(const char *option)
> >>   {
> >>   	char *hosts, *to, *p;
> >> -	int ret;
> >> +	int ret, interval, retry = 0, max_retry;
> >>   
> >>   	if (!option) {
> >>   		sd_err("You must specify zookeeper servers.");
> >> @@ -1371,10 +1371,22 @@ static int zk_init(const char *option)
> >>   		 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 connect to zk server %s", option);
> >> +		sd_err("failed to initialize zk server %s", option);
> >>   		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;
> >> +		}
> >> +	}
> >> +
> >>   	uatomic_set_false(&stop);
> >>   	uatomic_set_false(&is_master);
> >>   	if (zk_queue_init() != ZOK)
> >> -- 
> >> 1.8.3.2
> >>
> >>
> >> -- 
> >> sheepdog mailing list
> >> sheepdog at lists.wpkg.org
> >> http://lists.wpkg.org/mailman/listinfo/sheepdog
> 
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog



More information about the sheepdog mailing list