OSDN Git Service

rollback
[bytom/vapor.git] / toolbar / precognitive / monitor / connection.go
1 package monitor
2
3 import (
4         "net"
5         "time"
6
7         log "github.com/sirupsen/logrus"
8
9         "github.com/vapor/p2p"
10         "github.com/vapor/toolbar/precognitive/database/orm"
11 )
12
13 func (m *monitor) connectionRoutine() {
14         ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqMinutes) * time.Minute)
15         for ; true; <-ticker.C {
16                 if err := m.dialNodes(); err != nil {
17                         log.WithFields(log.Fields{"err": err}).Error("dialNodes")
18                 }
19         }
20 }
21
22 func (m *monitor) dialNodes() error {
23         log.Info("Start to reconnect to nodes...")
24         var nodes []*orm.Node
25         if err := m.db.Model(&orm.Node{}).Find(&nodes).Error; err != nil {
26                 return err
27         }
28
29         addresses := make([]*p2p.NetAddress, 0)
30         for i := 0; i < len(nodes); i++ {
31                 address := p2p.NewNetAddressIPPort(net.ParseIP(nodes[i].IP), nodes[i].Port)
32                 addresses = append(addresses, address)
33         }
34
35         // connected peers will be skipped in switch.DialPeers()
36         m.sw.DialPeers(addresses)
37         log.Info("DialPeers done.")
38         peerList := m.sw.GetPeers().List()
39         m.processDialResults(peerList)
40         m.checkStatus(peerList)
41         return nil
42 }
43
44 func (m *monitor) checkStatus(peerList []*p2p.Peer) {
45         for _, peer := range peerList {
46                 peer.Start()
47                 m.peers.AddPeer(peer)
48         }
49         log.WithFields(log.Fields{"num": len(m.sw.GetPeers().List()), "peers": m.sw.GetPeers().List()}).Info("connected peers")
50
51         for _, peerInfo := range m.peers.GetPeerInfos() {
52                 if peerInfo.Height > m.bestHeightSeen {
53                         m.bestHeightSeen = peerInfo.Height
54                 }
55         }
56         log.WithFields(log.Fields{"bestHeight": m.bestHeightSeen}).Info("peersInfo")
57         m.processPeerInfos(m.peers.GetPeerInfos())
58
59         for _, peer := range peerList {
60                 p := m.peers.GetPeer(peer.ID())
61                 if p == nil {
62                         continue
63                 }
64
65                 m.peers.RemovePeer(p.ID())
66         }
67         log.Info("Disonnect all peers.")
68 }