Skip to content

Commit fb8a363

Browse files
committed
update migartion and default cutoff time for online filter
1 parent ffdd415 commit fb8a363

File tree

3 files changed

+60
-74
lines changed

3 files changed

+60
-74
lines changed

node-registrar/pkg/db/db.go

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"strings"
88

99
"github.com/pkg/errors"
10-
"github.com/rs/zerolog/log"
1110
"gorm.io/driver/postgres"
1211
"gorm.io/gorm"
1312
"gorm.io/gorm/logger"
@@ -55,13 +54,6 @@ func NewDB(c Config) (Database, error) {
5554
return Database{}, err
5655
}
5756

58-
// Run the data migration for LastSeen field
59-
count, err := db.MigrateNodeLastSeen()
60-
if err != nil {
61-
return Database{}, errors.Wrap(err, "failed to migrate node last seen data")
62-
}
63-
log.Info().Msgf("Migration: Updated LastSeen for %d nodes", count)
64-
6557
return db, sql.Ping()
6658
}
6759

@@ -134,24 +126,3 @@ func (db Database) Close() error {
134126
func (db *Database) Transaction(fn func(tx *gorm.DB) error) error {
135127
return db.gormDB.Transaction(fn)
136128
}
137-
138-
// MigrateNodeLastSeen updates the LastSeen field for existing nodes that don't have it set
139-
func (db Database) MigrateNodeLastSeen() (int64, error) {
140-
query := `
141-
UPDATE nodes n
142-
SET last_seen = (
143-
SELECT MAX(timestamp)
144-
FROM uptime_reports ur
145-
WHERE ur.node_id = n.node_id
146-
)
147-
WHERE (last_seen IS NULL OR last_seen = '0001-01-01 00:00:00+00')
148-
AND EXISTS (
149-
SELECT 1
150-
FROM uptime_reports ur
151-
WHERE ur.node_id = n.node_id
152-
)
153-
`
154-
155-
result := db.gormDB.Exec(query)
156-
return result.RowsAffected, result.Error
157-
}

node-registrar/pkg/db/migrate.go

Lines changed: 58 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"strings"
55

66
"github.com/pkg/errors"
7+
"github.com/rs/zerolog/log"
8+
"gorm.io/gorm"
79
)
810

911
func (db Database) autoMigrate() error {
@@ -21,12 +23,18 @@ func (db Database) autoMigrate() error {
2123
return err
2224
}
2325

26+
err := db.MigrateNodeLastSeen()
27+
if err != nil {
28+
return errors.Wrap(err, "failed to migrate node last seen data")
29+
}
30+
2431
return nil
2532
}
2633

2734
func (db Database) migrateNodes() error {
2835
// if nodes are already migrated skip migration
2936
if result := db.gormDB.First(&Node{}); result.Error == nil {
37+
log.Info().Msg("nodes Interfaces are already migrated")
3038
return nil
3139
}
3240

@@ -36,56 +44,63 @@ func (db Database) migrateNodes() error {
3644
IPs string `json:"ips"`
3745
}
3846

47+
// we'd only load the data we actually need from the database
3948
type nodeType struct {
40-
NodeID uint64 `json:"node_id" gorm:"primaryKey;autoIncrement"`
41-
FarmID uint64 `json:"farm_id" gorm:"not null;check:farm_id> 0;foreignKey:FarmID;references:FarmID;constraint:OnDelete:RESTRICT"`
42-
TwinID uint64 `json:"twin_id" gorm:"not null;unique;check:twin_id > 0;foreignKey:TwinID;references:TwinID;constraint:OnDelete:RESTRICT"`
43-
44-
Location Location `json:"location" gorm:"not null;type:json;serializer:json"`
45-
46-
Resources Resources `json:"resources" gorm:"not null;type:json;serializer:json"`
47-
Interfaces []oldInterface `gorm:"not null;type:json;serializer:json"`
48-
SecureBoot bool `json:"secure_boot"`
49-
Virtualized bool `json:"virtualized"`
50-
SerialNumber string `json:"serial_number"`
51-
52-
Approved bool `json:"approved"`
49+
NodeID uint64 `json:"node_id" gorm:"primaryKey"`
50+
Interfaces []oldInterface `gorm:"not null;type:json;serializer:json"`
5351
}
5452

55-
var nodes []nodeType
56-
result := db.gormDB.Model(&Node{}).Find(&nodes)
57-
if result.Error != nil {
58-
return result.Error
59-
}
53+
// Use a single transaction for all updates to ensure atomicity
54+
return db.Transaction(func(tx *gorm.DB) error {
55+
var nodes []nodeType
56+
if err := tx.Model(&Node{}).Find(&nodes).Error; err != nil {
57+
return err
58+
}
6059

61-
for _, node := range nodes {
62-
var interfaces []Interface
63-
for _, i := range node.Interfaces {
64-
ips := strings.Split(i.IPs, "/")
65-
newInterface := Interface{
66-
Name: i.Name,
67-
Mac: i.Mac,
68-
IPs: ips,
60+
for _, node := range nodes {
61+
var interfaces []Interface
62+
for _, i := range node.Interfaces {
63+
ips := strings.Split(i.IPs, "/")
64+
newInterface := Interface{
65+
Name: i.Name,
66+
Mac: i.Mac,
67+
IPs: ips,
68+
}
69+
interfaces = append(interfaces, newInterface)
6970
}
70-
interfaces = append(interfaces, newInterface)
71-
}
7271

73-
updatedNode := Node{
74-
NodeID: node.NodeID,
75-
FarmID: node.FarmID,
76-
TwinID: node.TwinID,
77-
Location: node.Location,
78-
Resources: node.Resources,
79-
Interfaces: interfaces,
80-
SecureBoot: node.SecureBoot,
81-
Virtualized: node.Virtualized,
82-
Approved: node.Approved,
72+
// Update only the interfaces field
73+
if err := tx.Model(&Node{}).
74+
Where("node_id = ?", node.NodeID).
75+
Update("interfaces", interfaces).Error; err != nil {
76+
return err // This will roll back the entire transaction
77+
}
8378
}
8479

85-
err := db.gormDB.Model(&Node{}).Where("node_id = ?", node.NodeID).Updates(updatedNode).Error
86-
if err != nil {
87-
return err
88-
}
80+
return nil
81+
})
82+
}
83+
84+
// MigrateNodeLastSeen updates the LastSeen field for existing nodes that don't have it set
85+
func (db Database) MigrateNodeLastSeen() error {
86+
query := `
87+
UPDATE nodes n
88+
SET last_seen = (
89+
SELECT MAX(timestamp)
90+
FROM uptime_reports ur
91+
WHERE ur.node_id = n.node_id
92+
)
93+
WHERE (last_seen IS NULL OR last_seen = '0001-01-01 00:00:00+00')
94+
AND EXISTS (
95+
SELECT 1
96+
FROM uptime_reports ur
97+
WHERE ur.node_id = n.node_id
98+
)
99+
`
100+
101+
result := db.gormDB.Exec(query)
102+
if result.Error == nil {
103+
log.Info().Msgf("Migration: Updated LastSeen for %d nodes", result.RowsAffected)
89104
}
90-
return nil
105+
return result.Error
91106
}

node-registrar/pkg/db/nodes.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ func (db *Database) ListNodes(filter NodeFilter, limit Limit) (nodes []Node, err
2525

2626
// Filter by online status (node sent an uptime report in the last 30 minutes)
2727
if filter.Online != nil {
28-
// Calculate the cutoff time (30 minutes ago by default)
29-
cutoffMinutes := int64(30) // Default to 30 minutes
28+
// Calculate the cutoff time (40 minutes ago by default)
29+
cutoffMinutes := int64(40) // Default to 40 minutes
3030
if filter.LastSeen != nil {
3131
cutoffMinutes = *filter.LastSeen
3232
}

0 commit comments

Comments
 (0)