From b2ebc36ddad7f832242f7268c12f7e596fa734fc Mon Sep 17 00:00:00 2001 From: ben-toogood Date: Tue, 11 Aug 2020 12:42:22 +0100 Subject: [PATCH] router/registry: fix bug which impacts service registered in multiple domains (#1925) * router/registry: fix bug which impacts service registered in multiple domains * router/registry: bugfix --- registry.go | 13 ++++++++++--- table.go | 21 +++------------------ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/registry.go b/registry.go index ec46317..113e249 100644 --- a/registry.go +++ b/registry.go @@ -204,8 +204,11 @@ func (r *rtr) loadRoutes(reg registry.Registry) error { // if the routes exist save them if len(routes) > 0 { logger.Tracef("Creating routes for service %v domain: %v", service, domain) - // save the routes without pumping out events - r.table.saveRoutes(service.Name, routes) + for _, rt := range routes { + if err := r.table.Create(rt); err != nil { + logger.Errorf("Error creating route for service %v in domain %v: %v", service, domain, err) + } + } continue } @@ -224,7 +227,11 @@ func (r *rtr) loadRoutes(reg registry.Registry) error { if len(routes) > 0 { logger.Tracef("Creating routes for service %v domain: %v", srv, domain) - r.table.saveRoutes(srv.Name, routes) + for _, rt := range routes { + if err := r.table.Create(rt); err != nil { + logger.Errorf("Error creating route for service %v in domain %v: %v", service, domain, err) + } + } } } } diff --git a/table.go b/table.go index e62fa91..7e4b069 100644 --- a/table.go +++ b/table.go @@ -89,23 +89,6 @@ func (t *table) deleteService(service, network string) { t.routes[service] = routes } -// saveRoutes completely replaces the routes for a service -func (t *table) saveRoutes(service string, routes []router.Route) { - t.Lock() - defer t.Unlock() - - // delete old routes - delete(t.routes, service) - // make new map - t.routes[service] = make(map[uint64]*route) - - // iterate through new routes and save - for _, rt := range routes { - // save the new route - t.routes[service][rt.Hash()] = &route{rt, time.Now()} - } -} - // sendEvent sends events to all subscribed watchers func (t *table) sendEvent(e *router.Event) { t.RLock() @@ -369,7 +352,9 @@ func (t *table) Query(q ...router.QueryOption) ([]router.Route, error) { } // cache the routes - t.saveRoutes(opts.Service, routes) + for _, rt := range routes { + t.Create(rt) + } // try again if routes, ok := readAndFilter(opts); ok {