From bc972a52ab9de4bd501868ac896173fd38e8d8c7 Mon Sep 17 00:00:00 2001 From: Alvaro Saurin Date: Mon, 9 Nov 2015 12:17:18 +0100 Subject: [PATCH] Resolve to a group of names (instead of taking only the first one) --- probe/endpoint/reporter.go | 12 ++++-------- probe/endpoint/resolver.go | 18 +++++++++--------- probe/endpoint/resolver_internal_test.go | 6 +++--- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/probe/endpoint/reporter.go b/probe/endpoint/reporter.go index 24ad580eb..88ef46bf9 100644 --- a/probe/endpoint/reporter.go +++ b/probe/endpoint/reporter.go @@ -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 { diff --git a/probe/endpoint/resolver.go b/probe/endpoint/resolver.go index af11ad3d5..0f816d86e 100644 --- a/probe/endpoint/resolver.go +++ b/probe/endpoint/resolver.go @@ -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{}{}) } diff --git a/probe/endpoint/resolver_internal_test.go b/probe/endpoint/resolver_internal_test.go index a3ac4632e..f10ba5707 100644 --- a/probe/endpoint/resolver_internal_test.go +++ b/probe/endpoint/resolver_internal_test.go @@ -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 }) } }