fix: delete addrs when "updating" them to zero

1. Fix expiration check to check "not before" instead of after.
Otherwise, something that is expiring "now" won't count as expired. The
datastore-backed peerstore already had the correct logic.
2. Short-circuit updating the TTL to 0 and just delete the records.

Note: this wasn't causing problems on Linux (likely due to monotonic
clocks?) but was causing go-libp2p tests to fail reliably on Windows.
This commit is contained in:
Steven Allen 2021-04-29 16:58:08 -07:00
parent 74ed1a9974
commit cce0adbd0a
2 changed files with 22 additions and 4 deletions

View File

@ -25,7 +25,7 @@ type expiringAddr struct {
} }
func (e *expiringAddr) ExpiredBy(t time.Time) bool { func (e *expiringAddr) ExpiredBy(t time.Time) bool {
return t.After(e.Expires) return !t.Before(e.Expires)
} }
type peerRecordState struct { type peerRecordState struct {
@ -315,9 +315,15 @@ func (mab *memoryAddrBook) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL t
defer s.Unlock() defer s.Unlock()
exp := time.Now().Add(newTTL) exp := time.Now().Add(newTTL)
amap, found := s.addrs[p] amap, found := s.addrs[p]
if found { if !found {
for k, a := range amap { return
if oldTTL == a.TTL { }
for k, a := range amap {
if oldTTL == a.TTL {
if newTTL == 0 {
delete(amap, k)
} else {
a.TTL = newTTL a.TTL = newTTL
a.Expires = exp a.Expires = exp
amap[k] = a amap[k] = a

View File

@ -210,6 +210,18 @@ func testUpdateTTLs(m pstore.AddrBook) func(t *testing.T) {
m.UpdateAddrs(id, time.Hour, time.Minute) m.UpdateAddrs(id, time.Hour, time.Minute)
}) })
t.Run("update to 0 clears addrs", func(t *testing.T) {
id := GeneratePeerIDs(1)[0]
addrs := GenerateAddrs(1)
// Shouldn't panic.
m.SetAddrs(id, addrs, time.Hour)
m.UpdateAddrs(id, time.Hour, 0)
if len(m.Addrs(id)) != 0 {
t.Error("expected no addresses")
}
})
t.Run("update ttls successfully", func(t *testing.T) { t.Run("update ttls successfully", func(t *testing.T) {
ids := GeneratePeerIDs(2) ids := GeneratePeerIDs(2)
addrs1, addrs2 := GenerateAddrs(2), GenerateAddrs(2) addrs1, addrs2 := GenerateAddrs(2), GenerateAddrs(2)