Merge pull request '[agent/codex:gpt-5.4-mini] Read docs/RFC.md fully. Find ONE feature described in the sp...' (#38) from main into dev

This commit is contained in:
Virgil 2026-04-03 21:14:37 +00:00
commit 1baab6a293
3 changed files with 32 additions and 12 deletions

2
go.mod
View file

@ -4,6 +4,8 @@ go 1.22
require github.com/miekg/dns v1.1.62
require github.com/patrickmn/go-cache v2.1.0+incompatible
require (
golang.org/x/mod v0.18.0 // indirect
golang.org/x/net v0.27.0 // indirect

2
go.sum
View file

@ -1,5 +1,7 @@
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=

View file

@ -10,6 +10,8 @@ import (
"strings"
"sync"
"time"
cache "github.com/patrickmn/go-cache"
)
const defaultTreeRootCheckInterval = 15 * time.Second
@ -43,7 +45,7 @@ type ReverseLookupResult struct {
type Service struct {
mu sync.RWMutex
records map[string]NameRecords
reverseIndex map[string][]string
reverseIndex *cache.Cache
treeRoot string
zoneApex string
hsdClient *HSDClient
@ -99,7 +101,7 @@ func NewService(options ServiceOptions) *Service {
treeRoot := computeTreeRoot(cached)
return &Service{
records: cached,
reverseIndex: buildReverseIndex(cached),
reverseIndex: buildReverseIndexCache(cached),
treeRoot: treeRoot,
zoneApex: computeZoneApex(cached),
hsdClient: options.HSDClient,
@ -361,7 +363,7 @@ func (service *Service) replaceRecords(discovered map[string]NameRecords) {
service.mu.Lock()
defer service.mu.Unlock()
service.records = cached
service.reverseIndex = buildReverseIndex(service.records)
service.reverseIndex = buildReverseIndexCache(service.records)
service.treeRoot = computeTreeRoot(service.records)
service.zoneApex = computeZoneApex(service.records)
}
@ -373,7 +375,7 @@ func (service *Service) SetRecord(name string, record NameRecords) {
service.mu.Lock()
defer service.mu.Unlock()
service.records[normalizeName(name)] = record
service.reverseIndex = buildReverseIndex(service.records)
service.reverseIndex = buildReverseIndexCache(service.records)
service.treeRoot = computeTreeRoot(service.records)
service.zoneApex = computeZoneApex(service.records)
}
@ -385,7 +387,7 @@ func (service *Service) RemoveRecord(name string) {
service.mu.Lock()
defer service.mu.Unlock()
delete(service.records, normalizeName(name))
service.reverseIndex = buildReverseIndex(service.records)
service.reverseIndex = buildReverseIndexCache(service.records)
service.treeRoot = computeTreeRoot(service.records)
service.zoneApex = computeZoneApex(service.records)
}
@ -472,16 +474,26 @@ func (service *Service) ResolveAddress(name string) (ResolveAddressResult, bool)
//
// names, ok := service.ResolveReverse("10.10.10.10")
func (service *Service) ResolveReverse(ip string) ([]string, bool) {
service.mu.RLock()
defer service.mu.RUnlock()
normalizedIP := normalizeIP(ip)
if normalizedIP == "" {
return nil, false
}
names, ok := service.reverseIndex[normalizedIP]
if !ok {
service.mu.RLock()
reverseIndex := service.reverseIndex
service.mu.RUnlock()
if reverseIndex == nil {
return nil, false
}
rawNames, found := reverseIndex.Get(normalizedIP)
if !found {
return nil, false
}
names, ok := rawNames.([]string)
if !ok || len(names) == 0 {
return nil, false
}
return append([]string(nil), names...), true
@ -568,7 +580,7 @@ func resolveResult(record NameRecords) ResolveAllResult {
}
}
func buildReverseIndex(records map[string]NameRecords) map[string][]string {
func buildReverseIndexCache(records map[string]NameRecords) *cache.Cache {
raw := map[string]map[string]struct{}{}
for name, record := range records {
for _, ip := range record.A {
@ -606,7 +618,11 @@ func buildReverseIndex(records map[string]NameRecords) map[string][]string {
slices.Sort(unique)
reverseIndex[ip] = unique
}
return reverseIndex
reverseIndexCache := cache.New(cache.NoExpiration, cache.NoExpiration)
for ip, names := range reverseIndex {
reverseIndexCache.Set(ip, names, cache.NoExpiration)
}
return reverseIndexCache
}
func normalizeIP(ip string) string {