Files
EvoBGP/internal/store/memory_asn_cache.go
T
DenozordecandCursor f8e0520817 feat(httpapi): harden control plane and speed up prefix refresh
Очередь job получила lease и fencing, телеметрия и прогресс deploy сохраняются, ревизия пишет manifest входов. Обновление префиксов не переписывает неизменённый снимок, большие наборы идут через COPY, а устаревшая ревизия не попадает в deploy. Бандл ноды кэшируется, prune и постановка job больше не держат горячий путь.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-02 17:23:59 +07:00

63 lines
1.3 KiB
Go

package store
import (
"sort"
"time"
)
func (m *Memory) GetASNPrefixCache(asn int64) (*ASNPrefixCacheEntry, bool, error) {
m.mu.RLock()
defer m.mu.RUnlock()
if m.asnPrefixCache == nil {
return nil, false, nil
}
e, ok := m.asnPrefixCache[asn]
if !ok || e == nil {
return nil, false, nil
}
pfx := append([]string(nil), e.Prefixes...)
return &ASNPrefixCacheEntry{
ASN: asn,
Holder: e.Holder,
Prefixes: pfx,
FetchedAt: e.FetchedAt,
}, true, nil
}
func (m *Memory) SetASNPrefixCache(asn int64, holder string, prefixes []string) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.asnPrefixCache == nil {
m.asnPrefixCache = make(map[int64]*ASNPrefixCacheEntry)
}
if cur := m.asnPrefixCache[asn]; cur != nil && sameStringSet(cur.Prefixes, prefixes) {
cur.Holder = holder
cur.FetchedAt = time.Now().UTC()
return nil
}
cp := append([]string(nil), prefixes...)
m.asnPrefixCache[asn] = &ASNPrefixCacheEntry{
ASN: asn,
Holder: holder,
Prefixes: cp,
FetchedAt: time.Now().UTC(),
}
return nil
}
func sameStringSet(a, b []string) bool {
if len(a) != len(b) {
return false
}
aa := append([]string(nil), a...)
bb := append([]string(nil), b...)
sort.Strings(aa)
sort.Strings(bb)
for i := range aa {
if aa[i] != bb[i] {
return false
}
}
return true
}