}
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
// connected peers will be skipped in switch.DialPeers()
m.sw.DialPeers(addresses)
+ m.setConnected()
+ log.Info("DialPeers done.")
return nil
}
"os"
"os/user"
"strings"
+ "sync/atomic"
"time"
"github.com/jinzhu/gorm"
)
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 {
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()
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() {
// }
}
}
+
+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)
+}