From: Robin Dong <sanbai at taobao.com> When a sheep daemon call zk_unlock(), it will remove the whole znode of 'lock-id' and make zoo_create() fail in zk_lock() which called by another sheep daemon. To avoid this, we should try to create a znode of 'lock-id' if zoo_create() fail. Signed-off-by: Robin Dong <sanbai at taobao.com> --- sheep/cluster/zookeeper.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c index 4ef3a9a..14f5988 100644 --- a/sheep/cluster/zookeeper.c +++ b/sheep/cluster/zookeeper.c @@ -1256,6 +1256,11 @@ static void zk_lock(uint64_t lock_id) if (rc == ZOK) break; sd_err("failed to create path:%s, %s", my_path, zerror(rc)); + if (rc == ZNONODE) { + zoo_create(zhandle, parent, "", 0, &ZOO_OPEN_ACL_UNSAFE, + 0, NULL, 0); + continue; + } zk_wait(); } sd_debug("create path %s success", my_path); -- 1.7.12.4 |