-
-// TODO:
-// 现象是,时间区间过小时, 会一直有 dial ,但是不能 send业务层 msg
-// 还不确定是不是死锁,时间调大一点比如15s 就可以正确运行
-// 想法,自己再另外加锁,或者找到锁住的真正原因
-func (m *monitor) checkStatusRoutine() {
- peers := peers.NewPeerSet(m.sw)
- if err := m.prepareReactors(peers); err != nil {
- log.Fatal(err)
- }
-
- protocolReactor, ok := m.sw.GetReactors()["PROTOCOL"]
- if !ok {
- log.Fatal("protocolReactor not found")
- }
-
- bestHeight := uint64(0)
- ticker := time.NewTicker(time.Duration(m.cfg.CheckFreqSeconds) * time.Second)
- for range ticker.C {
- 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()
- protocolReactor.AddPeer(peer)
- }
-
- for _, peer := range m.sw.GetPeers().List() {
- p := peers.GetPeer(peer.ID())
- if p == nil {
- continue
- }
-
- if err := p.SendStatus(m.chain.BestBlockHeader(), m.chain.LastIrreversibleHeader()); err != nil {
- peers.RemovePeer(p.ID())
- }
- }
-
- for _, peerInfo := range peers.GetPeerInfos() {
- if peerInfo.Height > bestHeight {
- bestHeight = peerInfo.Height
- }
-
- m.savePeerInfo(peerInfo)
- }
- log.Info("bestHeight", bestHeight)
-
- // TODO:
- // msg := struct{ msgs.BlockchainMessage }{&msgs.GetBlockMessage{Height: bestHeight + 1}}
- // for _, peer := range m.sw.GetPeers().List() {
- // peers.SendMsg(peer.ID(), msgs.BlockchainChannel, msg)
- // }
-
- for _, peer := range m.sw.GetPeers().List() {
- p := peers.GetPeer(peer.ID())
- if p == nil {
- continue
- }
-
- peers.RemovePeer(p.ID())
- }
-
- m.setDisonnected()
- log.Info("Disonnect all peers.")
- }
-}
-
-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)
-}