7 log "github.com/sirupsen/logrus"
9 "github.com/vapor/toolbar/precog/database/orm"
12 func (m *monitor) connectionRoutine() {
14 // ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqMinutes) * time.Minute)
15 ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqMinutes) * time.Second)
16 for ; true; <-ticker.C {
19 if err := m.dialNodes(); err != nil {
20 log.WithFields(log.Fields{"err": err}).Error("dialNodes")
25 func (m *monitor) dialNodes() error {
26 log.Info("Start to reconnect to nodes...")
28 if err := m.db.Model(&orm.Node{}).Find(&nodes).Error; err != nil {
32 addresses := make([]*p2p.NetAddress, 0)
33 for i := 0; i < len(nodes); i++ {
34 address := p2p.NewNetAddressIPPort(net.ParseIP(nodes[i].IP), nodes[i].Port)
35 addresses = append(addresses, address)
38 // connected peers will be skipped in switch.DialPeers()
39 m.sw.DialPeers(addresses)
40 log.Info("DialPeers done.")
41 m.processDialResults()
46 func (m *monitor) checkStatus() {
47 for _, peer := range m.sw.GetPeers().List() {
51 log.WithFields(log.Fields{"num": len(m.sw.GetPeers().List()), "peers": m.sw.GetPeers().List()}).Info("connected peers")
53 for _, peer := range m.sw.GetPeers().List() {
54 p := m.peers.GetPeer(peer.ID())
59 if err := p.SendStatus(m.chain.BestBlockHeader(), m.chain.LastIrreversibleHeader()); err != nil {
60 log.WithFields(log.Fields{"peer": p, "err": err}).Error("SendStatus")
61 m.peers.RemovePeer(p.ID())
65 for _, peerInfo := range m.peers.GetPeerInfos() {
66 if peerInfo.Height > m.bestHeightSeen {
67 m.bestHeightSeen = peerInfo.Height
70 log.WithFields(log.Fields{"bestHeight": m.bestHeightSeen}).Info("peersInfo")
71 m.processPeerInfos(m.peers.GetPeerInfos())
73 for _, peer := range m.sw.GetPeers().List() {
74 p := m.peers.GetPeer(peer.ID())
79 m.peers.RemovePeer(p.ID())
81 log.Info("Disonnect all peers.")