diff --git a/remoting/zookeeper/client.go b/remoting/zookeeper/client.go index 0c70caa7fa9f8c6283616d66ffd459349833df39..f67a2549caf93cc9011e3b884014946227b580b8 100644 --- a/remoting/zookeeper/client.go +++ b/remoting/zookeeper/client.go @@ -44,6 +44,7 @@ const ( var ( errNilZkClientConn = perrors.New("zookeeperclient{conn} is nil") errNilChildren = perrors.Errorf("has none children") + errNilNode = perrors.Errorf("has none children") ) // ZookeeperClient ... @@ -499,19 +500,24 @@ func (z *ZookeeperClient) GetChildrenW(path string) ([]string, <-chan zk.Event, err = errNilZkClientConn z.Lock() - if z.Conn != nil { - children, stat, event, err = z.Conn.ChildrenW(path) - } + conn := z.Conn z.Unlock() + if conn != nil { + children, stat, event, err = conn.ChildrenW(path) + } + if err != nil { - if err == zk.ErrNoNode { + if err == zk.ErrNoChildrenForEphemerals { return nil, nil, perrors.Errorf("path{%s} has none children", path) } + if err == zk.ErrNoNode { + return nil, nil, errNilNode + } logger.Errorf("zk.ChildrenW(path{%s}) = error(%v)", path, err) return nil, nil, perrors.WithMessagef(err, "zk.ChildrenW(path:%s)", path) } if stat == nil { - return nil, nil, perrors.Errorf("path{%s} has none children", path) + return nil, nil, perrors.Errorf("path{%s} get stat is nil", path) } if len(children) == 0 { return nil, nil, errNilChildren diff --git a/remoting/zookeeper/listener.go b/remoting/zookeeper/listener.go index 6850aa3ffac28fbf52c2924649ef8ed1b149f88b..b32737a4657a0bafad3ea0385a1f4513cf787e68 100644 --- a/remoting/zookeeper/listener.go +++ b/remoting/zookeeper/listener.go @@ -201,6 +201,11 @@ func (l *ZkEventListener) listenDirEvent(zkPath string, listener remoting.DataLi } } l.client.RegisterEvent(zkPath, &event) + if err == errNilNode { + logger.Warnf("listenDirEvent(path{%s}) got errNilNode,so exit listen", zkPath) + l.client.UnregisterEvent(zkPath, &event) + return + } select { case <-getty.GetTimeWheel().After(timeSecondDuration(failTimes * ConnDelay)): l.client.UnregisterEvent(zkPath, &event)