[sheepdog] [PATCH v1 2/2] sheep: avoid dead loop when zookeeper session is expired
Liu Yuan
namei.unix at gmail.com
Wed Feb 19 05:51:52 CET 2014
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
More information about the sheepdog
mailing list