From 957916fd6bd2d538b7b20be6d0c0b0c65794aff1 Mon Sep 17 00:00:00 2001 From: Daulet Zhanguzin Date: Sat, 10 Apr 2021 21:34:00 +0100 Subject: [PATCH] Speed up route lookup by grouping mappers by server names --- app/discovery/discovery.go | 33 +++++++++++++++++++-------------- app/discovery/discovery_test.go | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/app/discovery/discovery.go b/app/discovery/discovery.go index a1493e4..7bde14b 100644 --- a/app/discovery/discovery.go +++ b/app/discovery/discovery.go @@ -18,7 +18,7 @@ import ( // Service implements discovery with multiple providers and url matcher type Service struct { providers []Provider - mappers []URLMapper + mappers map[string][]URLMapper lock sync.RWMutex } @@ -73,8 +73,10 @@ func (s *Service) Run(ctx context.Context) error { log.Printf("[INFO] match for %s: %s %s %s", m.ProviderID, m.Server, m.SrcMatch.String(), m.Dst) } s.lock.Lock() - s.mappers = make([]URLMapper, len(lst)) - copy(s.mappers, lst) + s.mappers = make(map[string][]URLMapper) + for _, m := range lst { + s.mappers[m.Server] = append(s.mappers[m.Server], m) + } s.lock.Unlock() } } @@ -85,13 +87,12 @@ func (s *Service) Match(srv, src string) (string, bool) { s.lock.RLock() defer s.lock.RUnlock() - for _, m := range s.mappers { - if m.Server != "*" && m.Server != "" && m.Server != srv { - continue - } - dest := m.SrcMatch.ReplaceAllString(src, m.Dst) - if src != dest { - return dest, true + for _, srvName := range []string {srv, "*", ""} { + for _, m := range s.mappers[srvName] { + dest := m.SrcMatch.ReplaceAllString(src, m.Dst) + if src != dest { + return dest, true + } } } return src, false @@ -101,11 +102,13 @@ func (s *Service) Match(srv, src string) (string, bool) { func (s *Service) Servers() (servers []string) { s.lock.RLock() defer s.lock.RUnlock() - for _, m := range s.mappers { - if m.Server == "*" || m.Server == "" { + for key, ms := range s.mappers { + if key == "*" || key == "" { continue } - servers = append(servers, m.Server) + for _, m := range ms { + servers = append(servers, m.Server) + } } return servers } @@ -114,7 +117,9 @@ func (s *Service) Servers() (servers []string) { func (s *Service) Mappers() (mappers []URLMapper) { s.lock.RLock() defer s.lock.RUnlock() - mappers = append(mappers, s.mappers...) + for _, m := range s.mappers { + mappers = append(mappers, m...) + } return mappers } diff --git a/app/discovery/discovery_test.go b/app/discovery/discovery_test.go index f1f4e29..c7e0f4c 100644 --- a/app/discovery/discovery_test.go +++ b/app/discovery/discovery_test.go @@ -105,7 +105,7 @@ func TestService_Match(t *testing.T) { err := svc.Run(ctx) require.Error(t, err) assert.Equal(t, context.DeadlineExceeded, err) - assert.Equal(t, 3, len(svc.mappers)) + assert.Equal(t, 3, len(svc.Mappers())) tbl := []struct { server, src string