From 6eedcc1da4570251f44648d683b23a5ac1353e10 Mon Sep 17 00:00:00 2001 From: Arceliar Date: Tue, 16 Jan 2018 17:36:29 -0600 Subject: [PATCH 1/2] use []expiringAddr instead map[string]expiringAddr in addr_manager.go --- addr_manager.go | 53 ++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/addr_manager.go b/addr_manager.go index aa913b8..96e11e2 100644 --- a/addr_manager.go +++ b/addr_manager.go @@ -52,13 +52,13 @@ func (e *expiringAddr) ExpiredBy(t time.Time) bool { return t.After(e.Expires) } -type addrSet map[string]expiringAddr +type addrSlice []expiringAddr // AddrManager manages addresses. // The zero-value is ready to be used. type AddrManager struct { addrmu sync.Mutex // guards addrs - addrs map[peer.ID]addrSet + addrs map[peer.ID]addrSlice addrSubs map[peer.ID][]*addrSub } @@ -67,7 +67,7 @@ type AddrManager struct { // So we can use the zero value. func (mgr *AddrManager) init() { if mgr.addrs == nil { - mgr.addrs = make(map[peer.ID]addrSet) + mgr.addrs = make(map[peer.ID]addrSlice) } if mgr.addrSubs == nil { mgr.addrSubs = make(map[peer.ID][]*addrSub) @@ -108,10 +108,9 @@ func (mgr *AddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat // so zero value can be used mgr.init() - amap, found := mgr.addrs[p] - if !found { - amap = make(addrSet) - mgr.addrs[p] = amap + amap := make(map[string]expiringAddr) + for _, ea := range mgr.addrs[p] { + amap[string(ea.Addr.Bytes())] = ea } subs := mgr.addrSubs[p] @@ -134,6 +133,11 @@ func (mgr *AddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat } } } + newAddrs := make([]expiringAddr, 0, len(amap)) + for _, ea := range amap { + newAddrs = append(newAddrs, ea) + } + mgr.addrs[p] = newAddrs } // SetAddr calls mgr.SetAddrs(p, addr, ttl) @@ -150,10 +154,9 @@ func (mgr *AddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat // so zero value can be used mgr.init() - amap, found := mgr.addrs[p] - if !found { - amap = make(addrSet) - mgr.addrs[p] = amap + amap := make(map[string]expiringAddr) + for _, ea := range mgr.addrs[p] { + amap[string(ea.Addr.Bytes())] = ea } subs := mgr.addrSubs[p] @@ -177,6 +180,11 @@ func (mgr *AddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat delete(amap, addrs) } } + newAddrs := make([]expiringAddr, 0, len(amap)) + for _, ea := range amap { + newAddrs = append(newAddrs, ea) + } + mgr.addrs[p] = newAddrs } // UpdateAddrs updates the addresses associated with the given peer that have @@ -221,21 +229,20 @@ func (mgr *AddrManager) Addrs(p peer.ID) []ma.Multiaddr { now := time.Now() good := make([]ma.Multiaddr, 0, len(maddrs)) - var expired []string - for s, m := range maddrs { - if m.ExpiredBy(now) { - expired = append(expired, s) - } else { + cleaned := make([]expiringAddr, 0, len(maddrs)) + for _, m := range maddrs { + if !m.ExpiredBy(now) { + cleaned = append(cleaned, m) good = append(good, m.Addr) } } // clean up the expired ones. - for _, s := range expired { - delete(maddrs, s) - } - if len(maddrs) == 0 { + mgr.addrs[p] = cleaned + if len(cleaned) == 0 { delete(mgr.addrs, p) + } else { + mgr.addrs[p] = cleaned } return good } @@ -295,9 +302,9 @@ func (mgr *AddrManager) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Mul mgr.addrSubs[p] = append(mgr.addrSubs[p], sub) - baseaddrset := mgr.addrs[p] - initial := make([]ma.Multiaddr, 0, len(baseaddrset)) - for _, a := range baseaddrset { + baseaddrslice := mgr.addrs[p] + initial := make([]ma.Multiaddr, 0, len(baseaddrslice)) + for _, a := range baseaddrslice { initial = append(initial, a.Addr) } From 83cd5386b118626cc1ce69b34a530be4514a5027 Mon Sep 17 00:00:00 2001 From: Arceliar Date: Wed, 17 Jan 2018 08:06:35 -0600 Subject: [PATCH 2/2] Preallocate maps and remove extra cleanup line. --- addr_manager.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/addr_manager.go b/addr_manager.go index 96e11e2..6f348f5 100644 --- a/addr_manager.go +++ b/addr_manager.go @@ -108,8 +108,9 @@ func (mgr *AddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat // so zero value can be used mgr.init() - amap := make(map[string]expiringAddr) - for _, ea := range mgr.addrs[p] { + oldAddrs := mgr.addrs[p] + amap := make(map[string]expiringAddr, len(oldAddrs)) + for _, ea := range oldAddrs { amap[string(ea.Addr.Bytes())] = ea } @@ -154,8 +155,9 @@ func (mgr *AddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat // so zero value can be used mgr.init() - amap := make(map[string]expiringAddr) - for _, ea := range mgr.addrs[p] { + oldAddrs := mgr.addrs[p] + amap := make(map[string]expiringAddr, len(oldAddrs)) + for _, ea := range oldAddrs { amap[string(ea.Addr.Bytes())] = ea } @@ -238,7 +240,6 @@ func (mgr *AddrManager) Addrs(p peer.ID) []ma.Multiaddr { } // clean up the expired ones. - mgr.addrs[p] = cleaned if len(cleaned) == 0 { delete(mgr.addrs, p) } else {