完善更新记录以排查IP分配重复问题

This commit is contained in:
2025-08-21 18:34:30 +08:00
parent e2c87cfa8b
commit 7e7d706f84
5 changed files with 52 additions and 18 deletions

View File

@@ -6,7 +6,7 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
func RecordChange(tx *gorm.DB, changes []model.Change) error { func RecordChangeEdges(tx *gorm.DB, changes []model.ChangeEdge) error {
if len(changes) == 0 { if len(changes) == 0 {
return nil return nil
} }
@@ -22,3 +22,7 @@ func RecordChange(tx *gorm.DB, changes []model.Change) error {
} }
return nil return nil
} }
func RecordChangeCity(tx *gorm.DB, change model.ChangeCity) error {
return tx.Create(&change).Error
}

View File

@@ -68,7 +68,7 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
// 如果每个网关在此城市都有节点且无需改变,就不需要重新分配节点 // 如果每个网关在此城市都有节点且无需改变,就不需要重新分配节点
// 相当于直接重新提交配置,此流程下配置更新是幂等的 // 相当于直接重新提交配置,此流程下配置更新是幂等的
var gateways2Update []model.Gateway var gateways2Change []model.Gateway
for _, gateway := range gateways { for _, gateway := range gateways {
oldConfig, exists := oldConfigsMap[gateway][city.Hash] oldConfig, exists := oldConfigsMap[gateway][city.Hash]
if exists && oldConfig.IsChange != 1 { if exists && oldConfig.IsChange != 1 {
@@ -80,17 +80,17 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
}, },
} }
} else { } else {
gateways2Update = append(gateways2Update, gateway) gateways2Change = append(gateways2Change, gateway)
} }
} }
if len(gateways2Update) == 0 {
count := len(gateways2Change)
if len(gateways2Change) == 0 {
continue continue
} }
// 否则获取足量新节点 // 否则获取足量新节点
offset := city.Offset offset := city.Offset
count := len(gateways2Update)
if count > city.EdgesCount { if count > city.EdgesCount {
slog.Warn(fmt.Sprintf("城市节点数量不足,跳过本次更新,城市:%s节点数%d网关数%d", city.Name, city.EdgesCount, count)) slog.Warn(fmt.Sprintf("城市节点数量不足,跳过本次更新,城市:%s节点数%d网关数%d", city.Name, city.EdgesCount, count))
continue continue
@@ -113,9 +113,9 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
// 更新网关配置 // 更新网关配置
var configs2Create []model.Config var configs2Create []model.Config
var configs2Update []model.ConfigUpdate var configs2Update []model.ConfigUpdate
var changes []model.Change var changes []model.ChangeEdge
for iGateway, gateway := range gateways2Update { for iGateway, gateway := range gateways2Change {
oldConfig, exists := oldConfigsMap[gateway][city.Hash] oldConfig, exists := oldConfigsMap[gateway][city.Hash]
newConfig := edges[iGateway] newConfig := edges[iGateway]
@@ -129,8 +129,9 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
IsChange: u.P(0), IsChange: u.P(0),
}) })
changes = append(changes, model.Change{ changes = append(changes, model.ChangeEdge{
Time: now, Time: now,
CityId: city.Id,
Gateway: gateway.Macaddr, Gateway: gateway.Macaddr,
OldEdge: oldConfig.Macaddr, OldEdge: oldConfig.Macaddr,
NewEdge: newConfig.Macaddr, NewEdge: newConfig.Macaddr,
@@ -157,8 +158,9 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
InnerIp: fmt.Sprintf("172.16.%d.%d", gateway.Id, iCity+2), InnerIp: fmt.Sprintf("172.16.%d.%d", gateway.Id, iCity+2),
}) })
changes = append(changes, model.Change{ changes = append(changes, model.ChangeEdge{
Time: now, Time: now,
CityId: city.Id,
Gateway: gateway.Macaddr, Gateway: gateway.Macaddr,
OldEdge: "", OldEdge: "",
NewEdge: newConfig.Macaddr, NewEdge: newConfig.Macaddr,
@@ -186,9 +188,20 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
if err != nil { if err != nil {
return fmt.Errorf("更新城市 %s 的偏移量失败:%w", city.Name, err) return fmt.Errorf("更新城市 %s 的偏移量失败:%w", city.Name, err)
} }
err = RecordChange(tx, changes)
err = RecordChangeCity(tx, model.ChangeCity{
Time: now,
CityId: city.Id,
Count: count,
OffsetOld: city.Offset,
OffsetNew: offset,
})
if err != nil { if err != nil {
return fmt.Errorf("记录变更失败:%w", err) return fmt.Errorf("记录城市变更失败:%w", err)
}
err = RecordChangeEdges(tx, changes)
if err != nil {
return fmt.Errorf("记录节点变更失败:%w", err)
} }
} }

View File

@@ -26,9 +26,9 @@ func main() {
defer clients.CloseRedis() defer clients.CloseRedis()
// 测试功能 // 测试功能
// actions.Update(actions.UpdateArgs{ actions.Update(actions.UpdateArgs{
// Mock: true, Mock: true,
// }) })
actions.Sync() // actions.Sync()
} }

16
model/change-city.go Normal file
View File

@@ -0,0 +1,16 @@
package model
import "time"
type ChangeCity struct {
Id int `gorm:"column:id;primaryKey"`
Time time.Time `gorm:"column:time"`
CityId int `gorm:"column:city_id"`
Count int `gorm:"column:count"`
OffsetOld int `gorm:"column:offset_old"`
OffsetNew int `gorm:"column:offset_new"`
}
func (ChangeCity) TableName() string {
return "change_city"
}

View File

@@ -2,9 +2,10 @@ package model
import "time" import "time"
type Change struct { type ChangeEdge struct {
Id int `gorm:"column:id;primaryKey"` Id int `gorm:"column:id;primaryKey"`
Time time.Time `gorm:"column:time"` Time time.Time `gorm:"column:time"`
CityId int `gorm:"column:city"`
Gateway string `gorm:"column:macaddr"` Gateway string `gorm:"column:macaddr"`
OldEdge string `gorm:"column:edge_old"` OldEdge string `gorm:"column:edge_old"`
NewEdge string `gorm:"column:edge_new"` NewEdge string `gorm:"column:edge_new"`
@@ -12,6 +13,6 @@ type Change struct {
Info string `gorm:"column:info"` Info string `gorm:"column:info"`
} }
func (Change) TableName() string { func (ChangeEdge) TableName() string {
return "change" return "change"
} }