OSDN Git Service

feat: add node discovery and status check (#374)
[bytom/vapor.git] / toolbar / precognitive / monitor / connection.go
diff --git a/toolbar/precognitive/monitor/connection.go b/toolbar/precognitive/monitor/connection.go
new file mode 100644 (file)
index 0000000..6072377
--- /dev/null
@@ -0,0 +1,68 @@
+package monitor
+
+import (
+       "net"
+       "time"
+
+       log "github.com/sirupsen/logrus"
+
+       "github.com/vapor/p2p"
+       "github.com/vapor/toolbar/precognitive/database/orm"
+)
+
+func (m *monitor) connectionRoutine() {
+       ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqMinutes) * time.Minute)
+       for ; true; <-ticker.C {
+               if err := m.dialNodes(); err != nil {
+                       log.WithFields(log.Fields{"err": err}).Error("dialNodes")
+               }
+       }
+}
+
+func (m *monitor) dialNodes() error {
+       log.Info("Start to reconnect to nodes...")
+       var nodes []*orm.Node
+       if err := m.db.Model(&orm.Node{}).Find(&nodes).Error; err != nil {
+               return err
+       }
+
+       addresses := make([]*p2p.NetAddress, 0)
+       for i := 0; i < len(nodes); i++ {
+               address := p2p.NewNetAddressIPPort(net.ParseIP(nodes[i].IP), nodes[i].Port)
+               addresses = append(addresses, address)
+       }
+
+       // connected peers will be skipped in switch.DialPeers()
+       m.sw.DialPeers(addresses)
+       log.Info("DialPeers done.")
+       peerList := m.sw.GetPeers().List()
+       m.processDialResults(peerList)
+       m.checkStatus(peerList)
+       return nil
+}
+
+func (m *monitor) checkStatus(peerList []*p2p.Peer) {
+       for _, peer := range peerList {
+               peer.Start()
+               m.peers.AddPeer(peer)
+       }
+       log.WithFields(log.Fields{"num": len(m.sw.GetPeers().List()), "peers": m.sw.GetPeers().List()}).Info("connected peers")
+
+       for _, peerInfo := range m.peers.GetPeerInfos() {
+               if peerInfo.Height > m.bestHeightSeen {
+                       m.bestHeightSeen = peerInfo.Height
+               }
+       }
+       log.WithFields(log.Fields{"bestHeight": m.bestHeightSeen}).Info("peersInfo")
+       m.processPeerInfos(m.peers.GetPeerInfos())
+
+       for _, peer := range peerList {
+               p := m.peers.GetPeer(peer.ID())
+               if p == nil {
+                       continue
+               }
+
+               m.peers.RemovePeer(p.ID())
+       }
+       log.Info("Disonnect all peers.")
+}