feat: eviction trunk cleanup + gateway auto-update on re-registration
This commit is contained in:
@@ -64,7 +64,7 @@ func main() {
|
||||
eng := engine.NewEngine(cfg)
|
||||
|
||||
// 3.1 Запускаем эвикцию stale-нод (очистка нод без метрик > 5 минут, проверка каждые 60 сек)
|
||||
eng.StartEvictionLoop(60*time.Second, 5*time.Minute, nil)
|
||||
eng.StartEvictionLoop(60*time.Second, 5*time.Minute)
|
||||
|
||||
// 4. ASCII логгер метрик
|
||||
metricsLogger, err := filelog.NewLogger(dataDir)
|
||||
@@ -81,16 +81,26 @@ func main() {
|
||||
|
||||
var apiHandler *api.API
|
||||
|
||||
// Авто-создание balance-транков при первой метрике от новой ноды
|
||||
// Авто-создание или обновление balance-транка при метрике от ноды
|
||||
sub.SetOnNewNode(func(nodeID, sipGateway string) {
|
||||
trunks, err := cfgMgr.ReadTrunks()
|
||||
if err != nil {
|
||||
log.Printf("[main] ошибка чтения транков для авто-создания: %v", err)
|
||||
return
|
||||
}
|
||||
// Проверяем идемпотентность: транк уже существует?
|
||||
for _, t := range trunks {
|
||||
// Ищем существующий balance-транк для этой ноды
|
||||
for i, t := range trunks {
|
||||
if t.Type == "balance" && t.NodeID == nodeID {
|
||||
if t.Gateway != sipGateway {
|
||||
trunks[i].Gateway = sipGateway
|
||||
trunks[i].UpdatedAt = time.Now().UTC()
|
||||
if err := cfgMgr.SaveTrunks(trunks); err != nil {
|
||||
log.Printf("[main] ошибка обновления gateway транка для %s: %v", nodeID, err)
|
||||
return
|
||||
}
|
||||
apiHandler.RebuildTrunkCache()
|
||||
log.Printf("[nats] обновлён gateway транка для ноды %s → %s", nodeID, sipGateway)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -121,6 +131,31 @@ func main() {
|
||||
// 6. HTTP API
|
||||
apiHandler = api.NewAPI(eng, cfgMgr, cfg.GetJWTSecret(), cfg.MonitoringAPIKey, sub.IsConnected, cfg)
|
||||
apiHandler.RebuildTrunkCache() // первичное построение in-memory кэша gateway
|
||||
|
||||
// При эвикции stale-ноды — удаляем её balance-транк из trunks.json
|
||||
eng.SetOnNodeEvicted(func(nodeID string) {
|
||||
trunks, err := cfgMgr.ReadTrunks()
|
||||
if err != nil {
|
||||
log.Printf("[main] ошибка чтения транков для очистки evicted ноды %s: %v", nodeID, err)
|
||||
return
|
||||
}
|
||||
filtered := make([]models.Trunk, 0, len(trunks))
|
||||
for _, t := range trunks {
|
||||
if t.Type == models.TrunkBalance && t.NodeID == nodeID {
|
||||
continue
|
||||
}
|
||||
filtered = append(filtered, t)
|
||||
}
|
||||
if len(filtered) == len(trunks) {
|
||||
return
|
||||
}
|
||||
if err := cfgMgr.SaveTrunks(filtered); err != nil {
|
||||
log.Printf("[main] ошибка сохранения транков после eviction %s: %v", nodeID, err)
|
||||
return
|
||||
}
|
||||
apiHandler.RebuildTrunkCache()
|
||||
log.Printf("[main] удалён balance-транк для evicted ноды %s", nodeID)
|
||||
})
|
||||
handler := apiHandler.Handler()
|
||||
|
||||
// 6.1 ESL-клиент (опционально — если сконфигурирован)
|
||||
|
||||
Reference in New Issue
Block a user