feat: eviction trunk cleanup + gateway auto-update on re-registration

This commit is contained in:
Maksim Totmin
2026-06-25 21:01:58 +07:00
parent 938c9e9362
commit 54d56690c6
3 changed files with 118 additions and 13 deletions
+39 -4
View File
@@ -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-клиент (опционально — если сконфигурирован)