8 "github.com/jinzhu/gorm"
9 log "github.com/sirupsen/logrus"
11 "github.com/vapor/crypto/ed25519/chainkd"
12 "github.com/vapor/netsync/peers"
13 "github.com/vapor/toolbar/precog/common"
14 "github.com/vapor/toolbar/precog/config"
15 "github.com/vapor/toolbar/precog/database/orm"
19 // TODO: get best_height
20 // TODO: decide check_height("best best_height" - "confirmations")
21 // TODO: get blockhash by check_height, get latency
22 // TODO: update lantency, active_time and status
24 // create or update: https://github.com/jinzhu/gorm/issues/1307
25 func (m *monitor) upSertNode(node *config.Node) error {
27 node.PublicKey = fmt.Sprintf("%v", node.XPub.PublicKey().String())
30 ormNode := &orm.Node{PublicKey: node.PublicKey}
31 if err := m.db.Where(&orm.Node{PublicKey: node.PublicKey}).First(ormNode).Error; err != nil && err != gorm.ErrRecordNotFound {
36 ormNode.Alias = node.Alias
39 ormNode.Xpub = node.XPub.String()
41 ormNode.Host = node.Host
42 ormNode.Port = node.Port
43 return m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
49 }).FirstOrCreate(ormNode).Error
52 func (m *monitor) processPeerInfos(peerInfos []*peers.PeerInfo) error {
53 for _, peerInfo := range peerInfos {
55 if err := m.processPeerInfo(dbTx, peerInfo); err != nil {
66 func (m *monitor) processPeerInfo(dbTx *gorm.DB, peerInfo *peers.PeerInfo) error {
67 xPub := &chainkd.XPub{}
68 if err := xPub.UnmarshalText([]byte(peerInfo.ID)); err != nil {
72 ormNode := &orm.Node{}
73 if err := dbTx.Model(&orm.Node{}).Where(&orm.Node{PublicKey: xPub.PublicKey().String()}).First(ormNode).Error; err != nil {
77 log.Debugf("peerInfo.Ping: %v", peerInfo.Ping)
78 ping, err := time.ParseDuration(peerInfo.Ping)
80 log.Debugf("Parse ping time err: %v", err)
84 ormNodeLiveness := &orm.NodeLiveness{
86 BestHeight: ormNode.BestHeight,
87 AvgLantencyMS: sql.NullInt64{Int64: ping.Nanoseconds() / 1000, Valid: true},
91 if err := dbTx.Model(&orm.NodeLiveness{}).Where("node_id = ? AND status != ?", ormNode.ID, common.NodeOfflineStatus).
92 UpdateColumn(&orm.NodeLiveness{
93 BestHeight: ormNodeLiveness.BestHeight,
94 AvgLantencyMS: ormNodeLiveness.AvgLantencyMS,
95 }).FirstOrCreate(ormNodeLiveness).Error; err != nil {
99 if err := dbTx.Model(&orm.Node{}).Where(&orm.Node{PublicKey: xPub.PublicKey().String()}).
100 UpdateColumn(&orm.Node{
101 Alias: peerInfo.Moniker,
103 BestHeight: peerInfo.Height,
104 // LatestDailyUptimeMinutes uint64
105 }).First(ormNode).Error; err != nil {