diff options
author | tyltr <tylitianrui@126.com> | 2021-09-20 22:44:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-20 16:44:32 +0200 |
commit | 711e421685d419ab41ef7cfe4886d069ffb2db9c (patch) | |
tree | 4f98ca42aeb72b11db6af28f5d4aeeff9e1953a3 /tcpdialer.go | |
parent | Remove useless runtime.KeepAlive (#1107) (diff) | |
download | fasthttp-711e421685d419ab41ef7cfe4886d069ffb2db9c.tar.gz fasthttp-711e421685d419ab41ef7cfe4886d069ffb2db9c.tar.bz2 fasthttp-711e421685d419ab41ef7cfe4886d069ffb2db9c.zip |
feat: improve TCPDialer by `sync.map` instead of `map+mutex` (#1106)
Diffstat (limited to 'tcpdialer.go')
-rw-r--r-- | tcpdialer.go | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/tcpdialer.go b/tcpdialer.go index 2317aca..261f62e 100644 --- a/tcpdialer.go +++ b/tcpdialer.go @@ -156,8 +156,7 @@ type TCPDialer struct { // DNSCacheDuration may be used to override the default DNS cache duration (DefaultDNSCacheDuration) DNSCacheDuration time.Duration - tcpAddrsLock sync.Mutex - tcpAddrsMap map[string]*tcpAddrEntry + tcpAddrsMap sync.Map concurrencyCh chan struct{} @@ -280,7 +279,6 @@ func (d *TCPDialer) dial(addr string, dualStack bool, timeout time.Duration) (ne d.DNSCacheDuration = DefaultDNSCacheDuration } - d.tcpAddrsMap = make(map[string]*tcpAddrEntry) go d.tcpAddrsClean() }) @@ -373,35 +371,32 @@ func (d *TCPDialer) tcpAddrsClean() { for { time.Sleep(time.Second) t := time.Now() - - d.tcpAddrsLock.Lock() - for k, e := range d.tcpAddrsMap { - if t.Sub(e.resolveTime) > expireDuration { - delete(d.tcpAddrsMap, k) + d.tcpAddrsMap.Range(func(k, v interface{}) bool { + if e, ok := v.(*tcpAddrEntry); ok && t.Sub(e.resolveTime) > expireDuration { + d.tcpAddrsMap.Delete(k) } - } - d.tcpAddrsLock.Unlock() + return true + }) + } } func (d *TCPDialer) getTCPAddrs(addr string, dualStack bool) ([]net.TCPAddr, uint32, error) { - d.tcpAddrsLock.Lock() - e := d.tcpAddrsMap[addr] - if e != nil && !e.pending && time.Since(e.resolveTime) > d.DNSCacheDuration { + item, exist := d.tcpAddrsMap.Load(addr) + e, ok := item.(*tcpAddrEntry) + if exist && ok && e != nil && !e.pending && time.Since(e.resolveTime) > d.DNSCacheDuration { e.pending = true e = nil } - d.tcpAddrsLock.Unlock() if e == nil { addrs, err := resolveTCPAddrs(addr, dualStack, d.Resolver) if err != nil { - d.tcpAddrsLock.Lock() - e = d.tcpAddrsMap[addr] - if e != nil && e.pending { + item, exist := d.tcpAddrsMap.Load(addr) + e, ok = item.(*tcpAddrEntry) + if exist && ok && e != nil && e.pending { e.pending = false } - d.tcpAddrsLock.Unlock() return nil, 0, err } @@ -409,10 +404,7 @@ func (d *TCPDialer) getTCPAddrs(addr string, dualStack bool) ([]net.TCPAddr, uin addrs: addrs, resolveTime: time.Now(), } - - d.tcpAddrsLock.Lock() - d.tcpAddrsMap[addr] = e - d.tcpAddrsLock.Unlock() + d.tcpAddrsMap.Store(addr, e) } idx := atomic.AddUint32(&e.addrsIdx, 1) |