From f5d6872c5169900ac95821ec11c315952254daea Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Mon, 7 Sep 2015 10:26:17 +0000 Subject: [PATCH] Don't rate limit requests that have already been resolved, and cache negative responses. --- probe/endpoint/resolver.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/probe/endpoint/resolver.go b/probe/endpoint/resolver.go index 9f2609adcb..e74638b96e 100644 --- a/probe/endpoint/resolver.go +++ b/probe/endpoint/resolver.go @@ -1,6 +1,7 @@ package endpoint import ( + "fmt" "net" "strings" "time" @@ -14,6 +15,8 @@ const ( rAddrCacheExpiration = 30 * time.Minute ) +var errNotFound = fmt.Errorf("Not found") + type revResFunc func(addr string) (names []string, err error) // ReverseResolver is a caching, reverse resolver. @@ -42,8 +45,11 @@ func NewReverseResolver() *ReverseResolver { // possible names that can be obtained for that IP. func (r *ReverseResolver) Get(address string) (string, error) { val, err := r.cache.Get(address) - if err == nil { - return val.(string), nil + if hostname, ok := val.(string); err == nil && ok { + return hostname, nil + } + if _, ok := val.(struct{}); err == nil && ok { + return "", errNotFound } if err == gcache.NotFoundKeyError { // We trigger a asynchronous reverse resolution when not cached @@ -52,20 +58,22 @@ func (r *ReverseResolver) Get(address string) (string, error) { default: } } - return "", err + return "", errNotFound } func (r *ReverseResolver) loop() { for request := range r.addresses { - <-r.Throttle // rate limit our DNS resolutions - // and check if the answer is already in the cache + // check if the answer is already in the cache if _, err := r.cache.Get(request); err == nil { continue } + <-r.Throttle // rate limit our DNS resolutions names, err := r.Resolver(request) if err == nil && len(names) > 0 { name := strings.TrimRight(names[0], ".") r.cache.Set(request, name) + } else { + r.cache.Set(request, struct{}{}) } } }