X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=toolbar%2Fprecog%2Fmonitor%2Fdiscover.go;h=2805a6d1c75cdaafec7cc0724c94025d2e40325b;hb=2ac71e9117bd9cd8b8c7434b99ddaca14ea9e676;hp=72c1e0018080b78ad7e267f9cd71041792de76f9;hpb=8be634c02d6ffe425ae823297f1631196c50bbeb;p=bytom%2Fvapor.git diff --git a/toolbar/precog/monitor/discover.go b/toolbar/precog/monitor/discover.go index 72c1e001..2805a6d1 100644 --- a/toolbar/precog/monitor/discover.go +++ b/toolbar/precog/monitor/discover.go @@ -1,7 +1,6 @@ package monitor import ( - "sync" "time" log "github.com/sirupsen/logrus" @@ -15,41 +14,37 @@ var ( discvFreqSec = 60 ) -func (m *monitor) discoveryRoutine(discvWg *sync.WaitGroup) { +func (m *monitor) discoveryRoutine() { ticker := time.NewTicker(time.Duration(discvFreqSec) * time.Second) - for range ticker.C { - nodes := make([]*dht.Node, nodesToDiscv) - n := m.sw.GetDiscv().ReadRandomNodes(nodes) m.Lock() - for i := 0; i < n; i++ { - m.discvCh <- nodes[i] - discvWg.Add(1) + + nodes := make([]*dht.Node, nodesToDiscv) + num := m.sw.GetDiscv().ReadRandomNodes(nodes) + for _, node := range nodes[:num] { + if n, ok := m.discvMap[node.ID.String()]; ok && n.String() == node.String() { + continue + } + + log.WithFields(log.Fields{"new node": node}).Info("discover") + m.saveDiscoveredNode(node) } - discvWg.Wait() + m.Unlock() } } -func (m *monitor) collectDiscoveredNodes(discvWg *sync.WaitGroup) { - // nodeMap maps a node's public key to the node itself - nodeMap := make(map[string]*dht.Node) - for node := range m.discvCh { - if n, ok := nodeMap[node.ID.String()]; ok && n.String() == node.String() { - continue - } - log.Infof("discover new node: %v", node) - - if err := m.upSertNode(&config.Node{ - PublicKey: node.ID.String(), - Host: node.IP.String(), - Port: node.TCP, - }); err == nil { - nodeMap[node.ID.String()] = node - } else { - log.Error(err) - } - - discvWg.Done() +func (m *monitor) saveDiscoveredNode(node *dht.Node) { + if err := m.upSertNode(&config.Node{ + PublicKey: node.ID.String(), + IP: node.IP.String(), + Port: node.TCP, + }); err == nil { + m.discvMap[node.ID.String()] = node + } else { + log.WithFields(log.Fields{ + "node": node, + "err": err, + }).Error("upSertNode") } }