From f530d0886f0e1eb91cdc1ef4b2ba75063ce4bd35 Mon Sep 17 00:00:00 2001 From: Chanwit Kaewkasi Date: Wed, 7 Jan 2015 12:31:19 +0700 Subject: [PATCH] implement a proper zookeeper watcher Signed-off-by: Chanwit Kaewkasi --- discovery/zookeeper/zookeeper.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/discovery/zookeeper/zookeeper.go b/discovery/zookeeper/zookeeper.go index bda6c74992..67fda8d6d1 100644 --- a/discovery/zookeeper/zookeeper.go +++ b/discovery/zookeeper/zookeeper.go @@ -65,13 +65,24 @@ func (s *ZkDiscoveryService) Fetch() ([]*discovery.Node, error) { } func (s *ZkDiscoveryService) Watch(callback discovery.WatchCallback) { - for _ = range time.Tick(time.Duration(s.heartbeat) * time.Second) { - log.Debugf("[ZK] Watch triggered") - nodes, err := s.Fetch() - if err == nil { - callback(nodes) - } + + _, _, eventChan, err := s.conn.ChildrenW(s.path) + if err != nil { + log.Debugf("[ZK] Watch aborted") + return } + + for e := range eventChan { + if e.Type == zk.EventNodeChildrenChanged { + log.Debugf("[ZK] Watch triggered") + nodes, err := s.Fetch() + if err == nil { + callback(nodes) + } + } + + } + } func (s *ZkDiscoveryService) Register(addr string) error {