Files
zt/tunnel/dns/refcount.go
Shawn CareyandGitHub 25a8fb2cca Optimize service add (#1727)
* don't check interface ips when getting ips from dns pool
* assign dns ip range to loopback instead of one-ip-at-a-time
* recycle unused dns ips
* replace $dst_hostname when calculating dial identity
* fall back to dummy resolver if server initialization fails.
2024-02-20 12:53:39 -05:00

63 lines
1.3 KiB
Go

package dns
import (
cmap "github.com/orcaman/concurrent-map/v2"
"net"
)
func NewRefCountingResolver(resolver Resolver) Resolver {
return &RefCountingResolver{
names: cmap.New[int](),
wrapped: resolver,
}
}
type RefCountingResolver struct {
names cmap.ConcurrentMap[string, int]
wrapped Resolver
}
func (self *RefCountingResolver) Lookup(ip net.IP) (string, error) {
return self.wrapped.Lookup(ip)
}
func (self *RefCountingResolver) AddDomain(name string, cb func(string) (net.IP, error)) error {
return self.wrapped.AddDomain(name, cb)
}
func (self *RefCountingResolver) RemoveDomain(name string) {
self.wrapped.RemoveDomain(name)
}
func (self *RefCountingResolver) AddHostname(s string, ip net.IP) error {
err := self.wrapped.AddHostname(s, ip)
if err != nil {
self.names.Upsert(s, 1, func(exist bool, valueInMap int, newValue int) int {
if exist {
return valueInMap + 1
}
return 1
})
}
return err
}
func (self *RefCountingResolver) RemoveHostname(s string) net.IP {
val := self.names.Upsert(s, 1, func(exist bool, valueInMap int, newValue int) int {
if exist {
return valueInMap - 1
}
return 0
})
if val == 0 {
self.names.Remove(s)
return self.wrapped.RemoveHostname(s)
}
return nil
}
func (self *RefCountingResolver) Cleanup() error {
return self.wrapped.Cleanup()
}