Resolve to a group of names (instead of taking only the first one)

This commit is contained in:
Alvaro Saurin
2015-11-09 12:17:18 +01:00
parent 73e05d01de
commit bc972a52ab
3 changed files with 16 additions and 20 deletions

View File

@@ -139,10 +139,8 @@ func (r *Reporter) addConnection(rpt *report.Report, localAddr, remoteAddr strin
// In case we have a reverse resolution for the IP, we can use it for
// the name...
if remoteName, err := r.reverseResolver.get(remoteAddr); err == nil {
remoteNode = remoteNode.WithMetadata(map[string]string{
"name": remoteName,
})
if remoteNames, err := r.reverseResolver.get(remoteAddr); err == nil {
remoteNode = remoteNode.WithSet("name", report.MakeStringSet(remoteNames...))
}
if localIsClient {
@@ -185,10 +183,8 @@ func (r *Reporter) addConnection(rpt *report.Report, localAddr, remoteAddr strin
// In case we have a reverse resolution for the IP, we can use it for
// the name...
if remoteName, err := r.reverseResolver.get(remoteAddr); err == nil {
remoteNode = remoteNode.WithMetadata(map[string]string{
"name": remoteName,
})
if remoteNames, err := r.reverseResolver.get(remoteAddr); err == nil {
remoteNode = remoteNode.WithSet("name", report.MakeStringSet(remoteNames...))
}
if localIsClient {

View File

@@ -3,7 +3,6 @@ package endpoint
import (
"fmt"
"net"
"sort"
"strings"
"time"
@@ -44,13 +43,13 @@ func newReverseResolver() *reverseResolver {
// get the reverse resolution for an IP address if already in the cache, a
// gcache.NotFoundKeyError error otherwise. Note: it returns one of the
// possible names that can be obtained for that IP.
func (r *reverseResolver) get(address string) (string, error) {
func (r *reverseResolver) get(address string) ([]string, error) {
val, err := r.cache.Get(address)
if hostname, ok := val.(string); err == nil && ok {
return hostname, nil
if hostnames, ok := val.([]string); err == nil && ok {
return hostnames, nil
}
if _, ok := val.(struct{}); err == nil && ok {
return "", errNotFound
return nil, errNotFound
}
if err == gcache.NotFoundKeyError {
// We trigger a asynchronous reverse resolution when not cached.
@@ -59,7 +58,7 @@ func (r *reverseResolver) get(address string) (string, error) {
default:
}
}
return "", errNotFound
return nil, errNotFound
}
func (r *reverseResolver) loop() {
@@ -71,9 +70,10 @@ func (r *reverseResolver) loop() {
<-r.Throttle // rate limit our DNS resolutions
names, err := r.Resolver(request)
if err == nil && len(names) > 0 {
sort.Strings(names)
name := strings.TrimRight(names[0], ".")
r.cache.Set(request, name)
for idx, name := range names {
names[idx] = strings.TrimRight(name, ".")
}
r.cache.Set(request, names)
} else {
r.cache.Set(request, struct{}{})
}

View File

@@ -29,9 +29,9 @@ func TestReverseResolver(t *testing.T) {
revRes.Throttle = time.Tick(time.Millisecond)
for ip, names := range tests {
test.Poll(t, 100*time.Millisecond, names[0], func() interface{} {
result, _ := revRes.get(ip)
return result
test.Poll(t, 100*time.Millisecond, names, func() interface{} {
ns, _ := revRes.get(ip)
return ns
})
}
}