From d3525ebab37ffc4812ff32cfe7efa2c92bb17597 Mon Sep 17 00:00:00 2001 From: Milos Gajdos Date: Tue, 18 Jun 2019 18:33:05 +0100 Subject: [PATCH] Debug messages. Squashed Add Route bugs and few others. --- router/default_router.go | 17 +++++++++++++++- router/default_table.go | 24 ++++++++++++++++++++-- router/query.go | 12 +++++++++++ router/route.go | 44 +++++++++++++++++++++++++++++++++++++--- 4 files changed, 91 insertions(+), 6 deletions(-) diff --git a/router/default_router.go b/router/default_router.go index 30c75fd0..6952bc87 100644 --- a/router/default_router.go +++ b/router/default_router.go @@ -7,6 +7,7 @@ import ( "sync" "time" + "github.com/micro/go-log" "github.com/micro/go-micro/registry" "github.com/olekukonko/tablewriter" ) @@ -206,6 +207,7 @@ func (r *router) manageServiceRoutes(w registry.Watcher, network string, metric if err != nil { watchErr = err + log.Logf("[router] registry error: %s", err) break } @@ -218,18 +220,25 @@ func (r *router) manageServiceRoutes(w registry.Watcher, network string, metric switch res.Action { case "create": + log.Logf("[router] received <%s> create event for service %s", network, res.Service.Name) if len(res.Service.Nodes) > 0 { + log.Logf("[router] adding <%s> service %s to routing table", network, res.Service.Name) /// only return error if the route is not duplicate, but something else has failed if err := r.opts.Table.Add(route); err != nil && err != ErrDuplicateRoute { return fmt.Errorf("failed to add route for service: %v", res.Service.Name) } + log.Logf("[router] route successfully added; routing table: \n%s", r.opts.Table) } case "delete": + log.Logf("[router] received <%s> delete event for service %s", network, res.Service.Name) + //log.Logf("[router] <%s> service nodes: %v", network, res.Service.Nodes) if len(res.Service.Nodes) < 1 { + log.Logf("[router] removing <%s> service %s from routing table", network, res.Service.Name) // only return error if the route is present in the table, but something else has failed if err := r.opts.Table.Delete(route); err != nil && err != ErrRouteNotFound { return fmt.Errorf("failed to delete route for service: %v", res.Service.Name) } + log.Logf("[router] route successfully deleted; routing table: \n%s", r.opts.Table) } } } @@ -260,6 +269,7 @@ func (r *router) watchTable(w Watcher) error { if err != nil { watchErr = err + log.Logf("[router] routing table error: %s", err) break } @@ -276,13 +286,18 @@ func (r *router) watchTable(w Watcher) error { switch event.Type { case CreateEvent: - if err := r.opts.NetworkRegistry.Register(service, registry.RegisterTTL(120*time.Second)); err != nil { + log.Logf("[router] adding service %s to network registry", event.Route.Options().DestAddr) + //if err := r.opts.NetworkRegistry.Register(service, registry.RegisterTTL(120*time.Second)); err != nil { + if err := r.opts.NetworkRegistry.Register(service, registry.RegisterTTL(5*time.Second)); err != nil { return fmt.Errorf("failed to register service %s in network registry: %v", service.Name, err) } + log.Logf("[router] successfully added service %s to network registry", event.Route.Options().DestAddr) case DeleteEvent: + log.Logf("[router] deleting service %s from network registry", event.Route.Options().DestAddr) if err := r.opts.NetworkRegistry.Deregister(service); err != nil { return fmt.Errorf("failed to deregister service %s from network registry: %v", service.Name, err) } + log.Logf("[router] successfully deleted service %s from network registry", event.Route.Options().DestAddr) } } diff --git a/router/default_table.go b/router/default_table.go index caec7356..648abd8f 100644 --- a/router/default_table.go +++ b/router/default_table.go @@ -8,6 +8,7 @@ import ( "sync" "github.com/google/uuid" + "github.com/micro/go-log" "github.com/olekukonko/tablewriter" ) @@ -70,16 +71,28 @@ func (t *table) Add(r Route) error { t.Lock() defer t.Unlock() + log.Logf("[table] AddRoute request %d %s: \n%s", sum, r.Options().Policy, r) + // check if the destination has any routes in the table if _, ok := t.m[destAddr]; !ok { + log.Logf("[table] destination does NOT exist ADDING: \n%s", r) t.m[destAddr] = make(map[uint64]Route) t.m[destAddr][sum] = r go t.sendEvent(&Event{Type: CreateEvent, Route: r}) return nil } + // add new route to the table for the given destination + if _, ok := t.m[destAddr][sum]; !ok { + log.Logf("[table] route does NOT exist ADDING: \n%s", r) + t.m[destAddr][sum] = r + go t.sendEvent(&Event{Type: CreateEvent, Route: r}) + return nil + } + // only add the route if it exists and if override is requested if _, ok := t.m[destAddr][sum]; ok && r.Options().Policy == OverrideIfExists { + log.Logf("[table] route does exist OVERRIDING: \n%s", r) t.m[destAddr][sum] = r go t.sendEvent(&Event{Type: UpdateEvent, Route: r}) return nil @@ -88,9 +101,12 @@ func (t *table) Add(r Route) error { // if we reached this point without already returning the route already exists // we return nil only if explicitly requested by the client if r.Options().Policy == IgnoreIfExists { + log.Logf("[table] route does exist IGNORING: \n%s", r) return nil } + log.Logf("[table] AddRoute request: DUPPLICATE ROUTE") + return ErrDuplicateRoute } @@ -102,7 +118,10 @@ func (t *table) Delete(r Route) error { destAddr := r.Options().DestAddr sum := t.hash(r) + log.Logf("[table] DeleteRoute request %d: \n%s", sum, r) + if _, ok := t.m[destAddr]; !ok { + log.Logf("[table] DeleteRoute Route NOT found: %s", r) return ErrRouteNotFound } @@ -237,7 +256,7 @@ func (t *table) String() string { strRoute := []string{ route.Options().DestAddr, route.Options().Gateway.Address(), - route.Options().Gateway.Network(), + route.Options().Network, fmt.Sprintf("%d", route.Options().Metric), } table.Append(strRoute) @@ -252,11 +271,12 @@ func (t *table) String() string { // hash hashes the route using router gateway and network address func (t *table) hash(r Route) uint64 { + destAddr := r.Options().DestAddr gwAddr := r.Options().Gateway.Address() netAddr := r.Options().Network t.h.Reset() - t.h.Write([]byte(gwAddr + netAddr)) + t.h.Write([]byte(destAddr + gwAddr + netAddr)) return t.h.Sum64() } diff --git a/router/query.go b/router/query.go index fe767856..54b52e22 100644 --- a/router/query.go +++ b/router/query.go @@ -10,6 +10,18 @@ const ( ClosestMatch ) +// String returns human representation of LookupPolicy +func (lp LookupPolicy) String() string { + switch lp { + case DiscardNoRoute: + return "DISCARD" + case ClosestMatch: + return "CLOSEST" + default: + return "UNKNOWN" + } +} + // QueryOption sets routing table query options type QueryOption func(*QueryOptions) diff --git a/router/route.go b/router/route.go index b0e120df..7942ed88 100644 --- a/router/route.go +++ b/router/route.go @@ -1,6 +1,11 @@ package router -import "context" +import ( + "fmt" + "strings" + + "github.com/olekukonko/tablewriter" +) var ( // DefaultLocalMetric is default route cost for local network @@ -19,6 +24,18 @@ const ( IgnoreIfExists ) +// String returns human reprensentation of policy +func (p AddPolicy) String() string { + switch p { + case OverrideIfExists: + return "OVERRIDE" + case IgnoreIfExists: + return "IGNORE" + default: + return "UNKNOWN" + } +} + // RouteOption is used to set routing table entry options type RouteOption func(*RouteOptions) @@ -34,8 +51,6 @@ type RouteOptions struct { Metric int // Policy defines route addition policy Policy AddPolicy - // Context stores other arbitrary options - Context context.Context } // DestAddr sets destination address @@ -100,3 +115,26 @@ func NewRoute(opts ...RouteOption) Route { func (r *route) Options() RouteOptions { return r.opts } + +// String allows to print the route +func (r *route) String() string { + // this will help us build routing table string + sb := &strings.Builder{} + + // create nice table printing structure + table := tablewriter.NewWriter(sb) + table.SetHeader([]string{"Destination", "Gateway", "Network", "Metric"}) + + strRoute := []string{ + r.opts.DestAddr, + r.opts.Gateway.Address(), + r.opts.Network, + fmt.Sprintf("%d", r.opts.Metric), + } + table.Append(strRoute) + + // render table into sb + table.Render() + + return sb.String() +}