完善更新记录以排查IP分配重复问题
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
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"
|
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"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user