+func (m *monitor) processDialResults() error {
+ var ormNodes []*orm.Node
+ if err := m.db.Model(&orm.Node{}).Find(&ormNodes).Error; err != nil {
+ return err
+ }
+
+ publicKeyMap := make(map[string]*orm.Node, len(ormNodes))
+ for _, ormNode := range ormNodes {
+ publicKeyMap[ormNode.PublicKey] = ormNode
+ }
+
+ connMap := make(map[string]bool, len(ormNodes))
+ // connected peers
+ for _, peer := range m.sw.GetPeers().List() {
+ xPub := &chainkd.XPub{}
+ if err := xPub.UnmarshalText([]byte(peer.Key)); err != nil {
+ log.Error(err)
+ continue
+ }
+
+ publicKey := xPub.PublicKey().String()
+ connMap[publicKey] = true
+ if err := m.processConnectedPeer(publicKeyMap[publicKey], peer); err != nil {
+ log.Error(err)
+ }
+ }
+
+ // offline peers
+ for _, ormNode := range ormNodes {
+ if _, ok := connMap[ormNode.PublicKey]; ok {
+ continue
+ }
+
+ if err := m.processOfflinePeer(ormNode); err != nil {
+ log.Error(err)
+ }
+ }
+
+ return nil
+}
+
+func (m *monitor) processConnectedPeer(ormNode *orm.Node, peer *p2p.Peer) error {
+ ormNodeLiveness := &orm.NodeLiveness{}
+ err := m.db.Model(&orm.NodeLiveness{}).Joins("join nodes on nodes.id = node_livenesses.node_id").
+ Where("nodes.public_key = ? AND status != ?", ormNode.PublicKey, common.NodeOfflineStatus).Last(ormNodeLiveness).Error
+ if err == nil {
+ return m.db.Model(&orm.NodeLiveness{}).Where(ormNodeLiveness).UpdateColumn(&orm.NodeLiveness{
+ PingTimes: ormNodeLiveness.PingTimes + 1,
+ }).Error
+ } else if err != gorm.ErrRecordNotFound {
+ return err
+ }
+
+ // gorm.ErrRecordNotFound
+ return m.db.Create(&orm.NodeLiveness{
+ NodeID: ormNode.ID,
+ PingTimes: 1,
+ Status: common.NodeUnknownStatus,
+ }).Error
+}
+
+func (m *monitor) processOfflinePeer(ormNode *orm.Node) error {
+ return m.db.Model(&orm.NodeLiveness{}).
+ Where(&orm.NodeLiveness{NodeID: ormNode.ID}).
+ UpdateColumn(&orm.NodeLiveness{
+ Status: common.NodeOfflineStatus,
+ }).Error
+}
+
+func (m *monitor) processPeerInfos(peerInfos []*peers.PeerInfo) error {
+ for _, peerInfo := range peerInfos {
+ dbTx := m.db.Begin()
+ if err := m.processPeerInfo(dbTx, peerInfo); err != nil {
+ log.Error(err)
+ dbTx.Rollback()
+ } else {
+ dbTx.Commit()
+ }
+ }
+
+ return nil
+}
+
+func (m *monitor) processPeerInfo(dbTx *gorm.DB, peerInfo *peers.PeerInfo) error {