From 6e27f877ffc942f9d8787fae520b95bad7674a67 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 27 Jul 2023 20:39:40 +0000 Subject: [PATCH] internal/clientinfo: use ptr cache when listing clients --- cmd/ctrld/control_client.go | 2 +- internal/clientinfo/client_info.go | 8 ++++++++ internal/clientinfo/ptr_lookup.go | 7 +++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cmd/ctrld/control_client.go b/cmd/ctrld/control_client.go index 0a94c99..8a41193 100644 --- a/cmd/ctrld/control_client.go +++ b/cmd/ctrld/control_client.go @@ -20,7 +20,7 @@ func newControlClient(addr string) *controlClient { return d.DialContext(ctx, "unix", addr) }, }, - Timeout: time.Second * 5, + Timeout: time.Second * 30, }} } diff --git a/internal/clientinfo/client_info.go b/internal/clientinfo/client_info.go index 4d6d065..f648ac9 100644 --- a/internal/clientinfo/client_info.go +++ b/internal/clientinfo/client_info.go @@ -229,6 +229,14 @@ func (t *Table) lookupHostnameAll(ip, mac string) []*hostnameEntry { var res []*hostnameEntry for _, r := range t.hostnameResolvers { src := r.String() + // For ptrDiscover, lookup hostname may block due to server unavailable, + // so only lookup from cache to prevent timeout reached. + if ptrResolver, ok := r.(*ptrDiscover); ok { + if name := ptrResolver.lookupHostnameFromCache(ip); name != "" { + res = append(res, &hostnameEntry{name: name, src: src}) + } + continue + } if name := r.LookupHostnameByIP(ip); name != "" { res = append(res, &hostnameEntry{name: name, src: src}) continue diff --git a/internal/clientinfo/ptr_lookup.go b/internal/clientinfo/ptr_lookup.go index 29526fa..ba76b12 100644 --- a/internal/clientinfo/ptr_lookup.go +++ b/internal/clientinfo/ptr_lookup.go @@ -40,6 +40,13 @@ func (p *ptrDiscover) String() string { return "ptr" } +func (p *ptrDiscover) lookupHostnameFromCache(ip string) string { + if val, ok := p.hostname.Load(ip); ok { + return val.(string) + } + return "" +} + func (p *ptrDiscover) lookupHostname(ip string) string { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel()