On Wed, Feb 19, 2014 at 09:51:23AM +0800, Robin Dong wrote: > From: Robin Dong <sanbai at taobao.com> > > When zookeeper session is expired, zk_get_least_seq() will return > ZNONODE, but we have not check the return value of zk_get_least_seq() > so the routine will fall in dead loop. > > To avoid it, we add check for return value of zk_get_least_seq() and > jump to recreate sequential-node if find out the ZNONODE event. > > Signed-off-by: Robin Dong <sanbai at taobao.com> > --- > sheep/cluster/zookeeper.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c > index 68d592d..5c21665 100644 > --- a/sheep/cluster/zookeeper.c > +++ b/sheep/cluster/zookeeper.c > @@ -1259,6 +1259,7 @@ static void zk_lock(uint64_t lock_id) > */ > snprintf(parent_node, MAX_NODE_STR_LEN, LOCK_ZNODE "/%"PRIu64, > cluster_lock->id); > +create_seq_node: > /* compete owner of lock is just like zk_compete_master() */ > while (true) { > rc = zk_create_node(parent, node_to_str(&this_node.node), > @@ -1283,9 +1284,13 @@ static void zk_lock(uint64_t lock_id) > > /* create node ok now */ > while (true) { > - zk_get_least_seq(parent_node, lowest_seq_path, MAX_NODE_STR_LEN, > - owner_name, &len); > - > + rc = zk_get_least_seq(parent_node, lowest_seq_path, > + MAX_NODE_STR_LEN, owner_name, &len); > + /* may be expired */ > + if (rc == ZNONODE) { > + sd_info("Recreate seq node"); seems that you tend to use sd_info for debuging, but sd_info is information for users. Thanks Yuan |