--- /dev/null
+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
+ }
+ }
+ }
+}