On Thu, Jan 16, 2014 at 04:11:04PM +0800, Robin Dong wrote: > 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; > + } I think sd_err() should be placed after if clause Thanks Yuan |