Очередь job получила lease и fencing, телеметрия и прогресс deploy сохраняются, ревизия пишет manifest входов. Обновление префиксов не переписывает неизменённый снимок, большие наборы идут через COPY, а устаревшая ревизия не попадает в deploy. Бандл ноды кэшируется, prune и постановка job больше не держат горячий путь. Co-authored-by: Cursor <[email protected]>
63 lines
1.3 KiB
Go
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
|
|
}
|