完善更新记录以排查IP分配重复问题
This commit is contained in:
@@ -6,7 +6,7 @@ import (
|
||||
"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 {
|
||||
return nil
|
||||
}
|
||||
@@ -22,3 +22,7 @@ func RecordChange(tx *gorm.DB, changes []model.Change) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func RecordChangeCity(tx *gorm.DB, change model.ChangeCity) error {
|
||||
return tx.Create(&change).Error
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
||||
|
||||
// 如果每个网关在此城市都有节点且无需改变,就不需要重新分配节点
|
||||
// 相当于直接重新提交配置,此流程下配置更新是幂等的
|
||||
var gateways2Update []model.Gateway
|
||||
var gateways2Change []model.Gateway
|
||||
for _, gateway := range gateways {
|
||||
oldConfig, exists := oldConfigsMap[gateway][city.Hash]
|
||||
if exists && oldConfig.IsChange != 1 {
|
||||
@@ -80,17 +80,17 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
||||
},
|
||||
}
|
||||
} else {
|
||||
gateways2Update = append(gateways2Update, gateway)
|
||||
gateways2Change = append(gateways2Change, gateway)
|
||||
}
|
||||
}
|
||||
if len(gateways2Update) == 0 {
|
||||
|
||||
count := len(gateways2Change)
|
||||
if len(gateways2Change) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// 否则获取足量新节点
|
||||
offset := city.Offset
|
||||
count := len(gateways2Update)
|
||||
|
||||
if count > city.EdgesCount {
|
||||
slog.Warn(fmt.Sprintf("城市节点数量不足,跳过本次更新,城市:%s,节点数:%d,网关数:%d", city.Name, city.EdgesCount, count))
|
||||
continue
|
||||
@@ -113,9 +113,9 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
||||
// 更新网关配置
|
||||
var configs2Create []model.Config
|
||||
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]
|
||||
newConfig := edges[iGateway]
|
||||
@@ -129,8 +129,9 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
||||
IsChange: u.P(0),
|
||||
})
|
||||
|
||||
changes = append(changes, model.Change{
|
||||
changes = append(changes, model.ChangeEdge{
|
||||
Time: now,
|
||||
CityId: city.Id,
|
||||
Gateway: gateway.Macaddr,
|
||||
OldEdge: oldConfig.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),
|
||||
})
|
||||
|
||||
changes = append(changes, model.Change{
|
||||
changes = append(changes, model.ChangeEdge{
|
||||
Time: now,
|
||||
CityId: city.Id,
|
||||
Gateway: gateway.Macaddr,
|
||||
OldEdge: "",
|
||||
NewEdge: newConfig.Macaddr,
|
||||
@@ -186,9 +188,20 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
||||
if err != nil {
|
||||
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 {
|
||||
return fmt.Errorf("记录变更失败:%w", err)
|
||||
return fmt.Errorf("记录城市变更失败:%w", err)
|
||||
}
|
||||
err = RecordChangeEdges(tx, changes)
|
||||
if err != nil {
|
||||
return fmt.Errorf("记录节点变更失败:%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,9 +26,9 @@ func main() {
|
||||
defer clients.CloseRedis()
|
||||
|
||||
// 测试功能
|
||||
// actions.Update(actions.UpdateArgs{
|
||||
// Mock: true,
|
||||
// })
|
||||
actions.Update(actions.UpdateArgs{
|
||||
Mock: true,
|
||||
})
|
||||
|
||||
actions.Sync()
|
||||
// actions.Sync()
|
||||
}
|
||||
|
||||
16
model/change-city.go
Normal file
16
model/change-city.go
Normal 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"
|
||||
}
|
||||
@@ -2,9 +2,10 @@ package model
|
||||
|
||||
import "time"
|
||||
|
||||
type Change struct {
|
||||
type ChangeEdge struct {
|
||||
Id int `gorm:"column:id;primaryKey"`
|
||||
Time time.Time `gorm:"column:time"`
|
||||
CityId int `gorm:"column:city"`
|
||||
Gateway string `gorm:"column:macaddr"`
|
||||
OldEdge string `gorm:"column:edge_old"`
|
||||
NewEdge string `gorm:"column:edge_new"`
|
||||
@@ -12,6 +13,6 @@ type Change struct {
|
||||
Info string `gorm:"column:info"`
|
||||
}
|
||||
|
||||
func (Change) TableName() string {
|
||||
func (ChangeEdge) TableName() string {
|
||||
return "change"
|
||||
}
|
||||
Reference in New Issue
Block a user