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 <lian...@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@lists.wpkg.org > >> http://lists.wpkg.org/mailman/listinfo/sheepdog > > > -- > sheepdog mailing list > sheepdog@lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog