in tracker/peerstore/local.go [190:242]
func (s *LocalStore) cleanupExpiredPeerEntries() {
s.mu.RLock()
groups := make([]*peerGroup, 0, len(s.peerGroups))
for _, g := range s.peerGroups {
groups = append(groups, g)
}
s.mu.RUnlock()
for _, g := range groups {
var expired []int
g.mu.RLock()
for i, e := range g.peerList {
if s.clk.Now().After(e.expiresAt) {
expired = append(expired, i)
}
}
g.mu.RUnlock()
if len(expired) == 0 {
// Fast path -- no need to acquire a write lock if there are no
// expired entries.
continue
}
g.mu.Lock()
for j := len(expired) - 1; j >= 0; j-- {
// Loop over expired indexes in reverse orders to perform fast slice
// element removal.
i := expired[j]
if i >= len(g.peerList) {
// Technically we're the only goroutine deleting peer entries,
// but let's play it safe.
continue
}
e := g.peerList[i]
// Must re-check the expiresAt timestamp in case an update occurred
// before we could acquire the write lock.
if s.clk.Now().Before(e.expiresAt) {
continue
}
// Remove the expired index.
g.peerList[i] = g.peerList[len(g.peerList)-1]
g.peerList = g.peerList[:len(g.peerList)-1]
delete(g.peerMap, e.id)
}
g.mu.Unlock()
}
}