OSDN Git Service

fix
authorHAOYUatHZ <haoyu@protonmail.com>
Mon, 19 Aug 2019 06:28:52 +0000 (14:28 +0800)
committerHAOYUatHZ <haoyu@protonmail.com>
Mon, 19 Aug 2019 06:28:52 +0000 (14:28 +0800)
toolbar/precog/monitor/connection.go
toolbar/precog/monitor/monitor.go

index fba88af..231f64d 100644 (file)
@@ -20,6 +20,10 @@ func (m *monitor) connectNodesRoutine() {
 }
 
 func (m *monitor) dialNodes() error {
+       for m.isConnected() {
+               time.Sleep(5 * time.Second)
+       }
+       log.Info("Start to reconnect to peers...")
        var nodes []*orm.Node
        if err := m.db.Model(&orm.Node{}).Find(&nodes).Error; err != nil {
                return err
@@ -43,5 +47,7 @@ func (m *monitor) dialNodes() error {
 
        // connected peers will be skipped in switch.DialPeers()
        m.sw.DialPeers(addresses)
+       m.setConnected()
+       log.Info("DialPeers done.")
        return nil
 }
index 5fdacd2..7e744b5 100644 (file)
@@ -6,6 +6,7 @@ import (
        "os"
        "os/user"
        "strings"
+       "sync/atomic"
        "time"
 
        "github.com/jinzhu/gorm"
@@ -28,20 +29,21 @@ import (
 )
 
 type monitor struct {
-       cfg     *config.Config
-       db      *gorm.DB
-       nodeCfg *vaporCfg.Config
-       sw      *p2p.Switch
-       discvCh chan *dht.Node
-       privKey chainkd.XPrv
-       chain   *mock.Chain
-       txPool  *mock.Mempool
+       cfg       *config.Config
+       db        *gorm.DB
+       nodeCfg   *vaporCfg.Config
+       sw        *p2p.Switch
+       discvCh   chan *dht.Node
+       privKey   chainkd.XPrv
+       chain     *mock.Chain
+       txPool    *mock.Mempool
+       connected uint32
 }
 
 // TODO: set myself as SPV?
 func NewMonitor(cfg *config.Config, db *gorm.DB) *monitor {
        //TODO: for test
-       cfg.CheckFreqSeconds = 15
+       cfg.CheckFreqSeconds = 30
 
        dbPath, err := makePath()
        if err != nil {
@@ -177,7 +179,10 @@ func (m *monitor) checkStatusRoutine() {
        bestHeight := uint64(0)
        ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqSeconds) * time.Second)
        for range ticker.C {
-               log.Info("m.sw.GetPeers().List()", m.sw.GetPeers().List())
+               for !m.isConnected() {
+                       time.Sleep(5 * time.Second)
+               }
+               log.Info("connected peers: ", m.sw.GetPeers().List())
 
                for _, peer := range m.sw.GetPeers().List() {
                        peer.Start()
@@ -213,6 +218,9 @@ func (m *monitor) checkStatusRoutine() {
                        peers.RemovePeer(p.ID())
                }
 
+               m.setDisonnected()
+               log.Info("Disonnect all peers.")
+
                // TODO:
                // msg := struct{ msgs.BlockchainMessage }{&msgs.GetBlockMessage{Height: bestHeight + 1}}
                // for _, peer := range m.sw.GetPeers().List() {
@@ -220,3 +228,16 @@ func (m *monitor) checkStatusRoutine() {
                // }
        }
 }
+
+func (m *monitor) isConnected() bool {
+       atomic.LoadUint32(&m.connected)
+       return m.connected == uint32(1)
+}
+
+func (m *monitor) setConnected() {
+       atomic.StoreUint32(&m.connected, 1)
+}
+
+func (m *monitor) setDisonnected() {
+       atomic.StoreUint32(&m.connected, 0)
+}