func()

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()
	}
}