+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.WithFields(log.Fields{"xpub": peer.Key}).Error("unmarshal xpub")
+ continue
+ }
+
+ publicKey := xPub.PublicKey().String()
+ connMap[publicKey] = true
+ if err := m.processConnectedPeer(publicKeyMap[publicKey], peer); err != nil {
+ log.WithFields(log.Fields{"peer publicKey": publicKey, "err": err}).Error("processConnectedPeer")
+ }
+ }
+
+ // offline peers
+ for _, ormNode := range ormNodes {
+ if _, ok := connMap[ormNode.PublicKey]; ok {
+ continue
+ }
+
+ if err := m.processOfflinePeer(ormNode); err != nil {
+ log.WithFields(log.Fields{"peer publicKey": ormNode.PublicKey, "err": err}).Error("processOfflinePeer")
+ }
+ }
+
+ return nil
+}
+
+func (m *monitor) processConnectedPeer(ormNode *orm.Node, peer *p2p.Peer) error {
+ ormNodeLiveness := &orm.NodeLiveness{NodeID: ormNode.ID}
+ err := m.db.Where(ormNodeLiveness).Last(ormNodeLiveness).Error
+ if err != nil && err != gorm.ErrRecordNotFound {
+ return err
+ }
+
+ ormNodeLiveness.PongTimes += 1
+ return m.db.Save(ormNodeLiveness).Error
+}
+
+func (m *monitor) processOfflinePeer(ormNode *orm.Node) error {
+ ormNode.Status = common.NodeOfflineStatus
+ return m.db.Save(ormNode).Error
+}
+
+func (m *monitor) processPeerInfos(peerInfos []*peers.PeerInfo) {
+ for _, peerInfo := range peerInfos {
+ dbTx := m.db.Begin()
+ if err := m.processPeerInfo(dbTx, peerInfo); err != nil {
+ log.WithFields(log.Fields{"peerInfo": peerInfo, "err": err}).Error("processPeerInfo")
+ dbTx.Rollback()
+ } else {
+ dbTx.Commit()
+ }
+ }
+}
+
+func (m *monitor) processPeerInfo(dbTx *gorm.DB, peerInfo *peers.PeerInfo) error {