OSDN Git Service

feat: add node discovery and status check (#374)
[bytom/vapor.git] / toolbar / precognitive / monitor / discover.go
1 package monitor
2
3 import (
4         "fmt"
5         "time"
6
7         log "github.com/sirupsen/logrus"
8
9         "github.com/vapor/p2p/discover/dht"
10         "github.com/vapor/toolbar/precognitive/config"
11 )
12
13 var (
14         nodesToDiscv = 150
15         discvFreqSec = 60
16 )
17
18 func (m *monitor) discoveryRoutine() {
19         discvMap := make(map[string]*dht.Node)
20         ticker := time.NewTicker(time.Duration(discvFreqSec) * time.Second)
21         for range ticker.C {
22                 nodes := make([]*dht.Node, nodesToDiscv)
23                 num := m.sw.GetDiscv().ReadRandomNodes(nodes)
24                 for _, node := range nodes[:num] {
25                         address := fmt.Sprintf("%s:%d", node.IP.String(), node.TCP)
26                         if n, ok := discvMap[address]; ok && n.String() == node.String() {
27                                 continue
28                         }
29
30                         log.WithFields(log.Fields{"new node": node}).Info("discover")
31
32                         if err := m.upsertNode(&config.Node{
33                                 PublicKey: node.ID.String(),
34                                 IP:        node.IP.String(),
35                                 Port:      node.TCP,
36                         }); err != nil {
37                                 log.WithFields(log.Fields{"node": node, "err": err}).Error("upsertNode")
38                         } else {
39                                 discvMap[address] = node
40                         }
41                 }
42         }
43 }