|
|
@@ -7,7 +7,6 @@
|
|
|
package discover
|
|
|
|
|
|
import (
|
|
|
- "sort"
|
|
|
stdsync "sync"
|
|
|
"time"
|
|
|
|
|
|
@@ -25,7 +24,7 @@ import (
|
|
|
// or negative).
|
|
|
type CachingMux interface {
|
|
|
FinderService
|
|
|
- Add(finder Finder, cacheTime, negCacheTime time.Duration, priority int)
|
|
|
+ Add(finder Finder, cacheTime, negCacheTime time.Duration)
|
|
|
ChildErrors() map[string]error
|
|
|
}
|
|
|
|
|
|
@@ -41,14 +40,6 @@ type cachedFinder struct {
|
|
|
Finder
|
|
|
cacheTime time.Duration
|
|
|
negCacheTime time.Duration
|
|
|
- priority int
|
|
|
-}
|
|
|
-
|
|
|
-// A prioritizedAddress is what we use to sort addresses returned from
|
|
|
-// different sources with different priorities.
|
|
|
-type prioritizedAddress struct {
|
|
|
- priority int
|
|
|
- addr string
|
|
|
}
|
|
|
|
|
|
// An error may implement cachedError, in which case it will be interrogated
|
|
|
@@ -66,9 +57,9 @@ func NewCachingMux() CachingMux {
|
|
|
}
|
|
|
|
|
|
// Add registers a new Finder, with associated cache timeouts.
|
|
|
-func (m *cachingMux) Add(finder Finder, cacheTime, negCacheTime time.Duration, priority int) {
|
|
|
+func (m *cachingMux) Add(finder Finder, cacheTime, negCacheTime time.Duration) {
|
|
|
m.mut.Lock()
|
|
|
- m.finders = append(m.finders, cachedFinder{finder, cacheTime, negCacheTime, priority})
|
|
|
+ m.finders = append(m.finders, cachedFinder{finder, cacheTime, negCacheTime})
|
|
|
m.caches = append(m.caches, newCache())
|
|
|
m.mut.Unlock()
|
|
|
|
|
|
@@ -80,8 +71,6 @@ func (m *cachingMux) Add(finder Finder, cacheTime, negCacheTime time.Duration, p
|
|
|
// Lookup attempts to resolve the device ID using any of the added Finders,
|
|
|
// while obeying the cache settings.
|
|
|
func (m *cachingMux) Lookup(deviceID protocol.DeviceID) (addresses []string, err error) {
|
|
|
- var paddresses []prioritizedAddress
|
|
|
-
|
|
|
m.mut.RLock()
|
|
|
for i, finder := range m.finders {
|
|
|
if cacheEntry, ok := m.caches[i].Get(deviceID); ok {
|
|
|
@@ -91,9 +80,7 @@ func (m *cachingMux) Lookup(deviceID protocol.DeviceID) (addresses []string, err
|
|
|
// It's a positive, valid entry. Use it.
|
|
|
l.Debugln("cached discovery entry for", deviceID, "at", finder)
|
|
|
l.Debugln(" cache:", cacheEntry)
|
|
|
- for _, addr := range cacheEntry.Addresses {
|
|
|
- paddresses = append(paddresses, prioritizedAddress{finder.priority, addr})
|
|
|
- }
|
|
|
+ addresses = append(addresses, cacheEntry.Addresses...)
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
@@ -112,9 +99,7 @@ func (m *cachingMux) Lookup(deviceID protocol.DeviceID) (addresses []string, err
|
|
|
if addrs, err := finder.Lookup(deviceID); err == nil {
|
|
|
l.Debugln("lookup for", deviceID, "at", finder)
|
|
|
l.Debugln(" addresses:", addrs)
|
|
|
- for _, addr := range addrs {
|
|
|
- paddresses = append(paddresses, prioritizedAddress{finder.priority, addr})
|
|
|
- }
|
|
|
+ addresses = append(addresses, addrs...)
|
|
|
m.caches[i].Set(deviceID, CacheEntry{
|
|
|
Addresses: addrs,
|
|
|
when: time.Now(),
|
|
|
@@ -134,10 +119,11 @@ func (m *cachingMux) Lookup(deviceID protocol.DeviceID) (addresses []string, err
|
|
|
}
|
|
|
m.mut.RUnlock()
|
|
|
|
|
|
- addresses = uniqueSortedAddrs(paddresses)
|
|
|
l.Debugln("lookup results for", deviceID)
|
|
|
l.Debugln(" addresses: ", addresses)
|
|
|
|
|
|
+ addresses = util.UniqueStrings(addresses)
|
|
|
+
|
|
|
return addresses, nil
|
|
|
}
|
|
|
|
|
|
@@ -239,35 +225,3 @@ func (c *cache) Cache() map[protocol.DeviceID]CacheEntry {
|
|
|
c.mut.Unlock()
|
|
|
return m
|
|
|
}
|
|
|
-
|
|
|
-func uniqueSortedAddrs(ss []prioritizedAddress) []string {
|
|
|
- // We sort the addresses by priority, then filter them based on seen
|
|
|
- // (first time seen is the on kept, so we retain priority).
|
|
|
- sort.Sort(prioritizedAddressList(ss))
|
|
|
- filtered := make([]string, 0, len(ss))
|
|
|
- seen := make(map[string]struct{}, len(ss))
|
|
|
- for _, s := range ss {
|
|
|
- if _, ok := seen[s.addr]; !ok {
|
|
|
- filtered = append(filtered, s.addr)
|
|
|
- seen[s.addr] = struct{}{}
|
|
|
- }
|
|
|
- }
|
|
|
- return filtered
|
|
|
-}
|
|
|
-
|
|
|
-type prioritizedAddressList []prioritizedAddress
|
|
|
-
|
|
|
-func (l prioritizedAddressList) Len() int {
|
|
|
- return len(l)
|
|
|
-}
|
|
|
-
|
|
|
-func (l prioritizedAddressList) Swap(a, b int) {
|
|
|
- l[a], l[b] = l[b], l[a]
|
|
|
-}
|
|
|
-
|
|
|
-func (l prioritizedAddressList) Less(a, b int) bool {
|
|
|
- if l[a].priority != l[b].priority {
|
|
|
- return l[a].priority < l[b].priority
|
|
|
- }
|
|
|
- return l[a].addr < l[b].addr
|
|
|
-}
|