From 09b14ad987494c3f0033103f200ab063e0d97c3f Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Mon, 19 Aug 2019 14:28:52 +0800 Subject: [PATCH] fix --- toolbar/precog/monitor/connection.go | 6 ++++++ toolbar/precog/monitor/monitor.go | 41 +++++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/toolbar/precog/monitor/connection.go b/toolbar/precog/monitor/connection.go index fba88af4..231f64da 100644 --- a/toolbar/precog/monitor/connection.go +++ b/toolbar/precog/monitor/connection.go @@ -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 } diff --git a/toolbar/precog/monitor/monitor.go b/toolbar/precog/monitor/monitor.go index 5fdacd2f..7e744b5c 100644 --- a/toolbar/precog/monitor/monitor.go +++ b/toolbar/precog/monitor/monitor.go @@ -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) +} -- 2.11.0