OSDN Git Service

feat: add node discovery and status check (#374)
[bytom/vapor.git] / toolbar / precognitive / monitor / discover.go
diff --git a/toolbar/precognitive/monitor/discover.go b/toolbar/precognitive/monitor/discover.go
new file mode 100644 (file)
index 0000000..6eb8781
--- /dev/null
@@ -0,0 +1,43 @@
+package monitor
+
+import (
+       "fmt"
+       "time"
+
+       log "github.com/sirupsen/logrus"
+
+       "github.com/vapor/p2p/discover/dht"
+       "github.com/vapor/toolbar/precognitive/config"
+)
+
+var (
+       nodesToDiscv = 150
+       discvFreqSec = 60
+)
+
+func (m *monitor) discoveryRoutine() {
+       discvMap := make(map[string]*dht.Node)
+       ticker := time.NewTicker(time.Duration(discvFreqSec) * time.Second)
+       for range ticker.C {
+               nodes := make([]*dht.Node, nodesToDiscv)
+               num := m.sw.GetDiscv().ReadRandomNodes(nodes)
+               for _, node := range nodes[:num] {
+                       address := fmt.Sprintf("%s:%d", node.IP.String(), node.TCP)
+                       if n, ok := discvMap[address]; ok && n.String() == node.String() {
+                               continue
+                       }
+
+                       log.WithFields(log.Fields{"new node": node}).Info("discover")
+
+                       if err := m.upsertNode(&config.Node{
+                               PublicKey: node.ID.String(),
+                               IP:        node.IP.String(),
+                               Port:      node.TCP,
+                       }); err != nil {
+                               log.WithFields(log.Fields{"node": node, "err": err}).Error("upsertNode")
+                       } else {
+                               discvMap[address] = node
+                       }
+               }
+       }
+}