From 1ff65e140a0818bd7a68fd9dcec0421cd86efb34 Mon Sep 17 00:00:00 2001 From: Milos Gajdos Date: Wed, 23 Oct 2019 12:53:36 +0100 Subject: [PATCH] Change router.Route metric to int64. Set the route metric properly --- client/selector/router/router.go | 2 +- network/default.go | 56 ++++++++++++++++++++++++++------ router/handler/router.go | 8 ++--- router/handler/table.go | 10 +++--- router/route.go | 6 ++-- router/service/service.go | 6 ++-- router/service/table.go | 10 +++--- router/service/watcher.go | 2 +- 8 files changed, 67 insertions(+), 33 deletions(-) diff --git a/client/selector/router/router.go b/client/selector/router/router.go index 0f1f6c58..015bc1e3 100644 --- a/client/selector/router/router.go +++ b/client/selector/router/router.go @@ -111,7 +111,7 @@ func (r *routerSelector) getRoutes(service string) ([]router.Route, error) { Gateway: r.Gateway, Network: r.Network, Link: r.Link, - Metric: int(r.Metric), + Metric: r.Metric, }) } diff --git a/network/default.go b/network/default.go index 89a1ea59..2ef22ff3 100644 --- a/network/default.go +++ b/network/default.go @@ -653,6 +653,38 @@ func (n *network) acceptCtrlConn(l tunnel.Listener, recv chan *Message) { } } +// getHopCount queries network graph and returns hop count for given router +// - Routes for local services have hop count 1 +// - Routes with ID of adjacent nodes have hop count 2 +// - Routes by peers of the advertiser have hop count 3 +// - Routes beyond node neighbourhood have hop count 4 +func (n *network) getHopCount(rtr string) int { + // make sure node.peers are not modified + n.node.RLock() + defer n.node.RUnlock() + + // we are the origin of the route + if rtr == n.options.Id { + return 1 + } + + // the route origin is our peer + if _, ok := n.peers[rtr]; ok { + return 2 + } + + // the route origin is the peer of our peer + for _, peer := range n.peers { + for id := range peer.peers { + if rtr == id { + return 3 + } + } + } + // otherwise we are three hops away + return 4 +} + // processCtrlChan processes messages received on ControlChannel func (n *network) processCtrlChan(listener tunnel.Listener) { // receive control message queue @@ -703,23 +735,27 @@ func (n *network) processCtrlChan(listener tunnel.Listener) { Network: event.Route.Network, Router: event.Route.Router, Link: event.Route.Link, - Metric: int(event.Route.Metric), + Metric: event.Route.Metric, } // set the route metric n.RLock() if link, ok := n.peerLinks[event.Route.Gateway]; ok { - // NOTE: should we change router.Route.Metric to int64? - if int(link.Length()) < route.Metric { - route.Metric = int(link.Length()) + // maka sure delay is non-zero + delay := link.Delay() + if delay == 0 { + delay = 1 } + // get the route hop count + hops := n.getHopCount(event.Route.Router) + // make sure length is non-zero + length := link.Length() + if length == 0 { + length = 10e10 + } + metric := (delay * length * int64(hops)) / 10e9 + route.Metric += metric } n.RUnlock() - // TODO: Are we dropping any routes? - // throw away metric bigger than 1000 - //if route.Metric > 1000 { - // log.Debugf("Network route metric %d dropping node: %s", route.Metric, route.Router) - // continue - //} // create router event e := &router.Event{ Type: router.EventType(event.Type), diff --git a/router/handler/router.go b/router/handler/router.go index f8b8cc51..6b71f70f 100644 --- a/router/handler/router.go +++ b/router/handler/router.go @@ -31,7 +31,7 @@ func (r *Router) Lookup(ctx context.Context, req *pb.LookupRequest, resp *pb.Loo Network: route.Network, Router: route.Router, Link: route.Link, - Metric: int64(route.Metric), + Metric: route.Metric, } respRoutes = append(respRoutes, respRoute) } @@ -67,7 +67,7 @@ func (r *Router) Advertise(ctx context.Context, req *pb.Request, stream pb.Route Network: event.Route.Network, Router: event.Route.Router, Link: event.Route.Link, - Metric: int64(event.Route.Metric), + Metric: event.Route.Metric, } e := &pb.Event{ Type: pb.EventType(event.Type), @@ -108,7 +108,7 @@ func (r *Router) Process(ctx context.Context, req *pb.Advert, rsp *pb.ProcessRes Network: event.Route.Network, Router: event.Route.Router, Link: event.Route.Link, - Metric: int(event.Route.Metric), + Metric: event.Route.Metric, } events[i] = &router.Event{ @@ -174,7 +174,7 @@ func (r *Router) Watch(ctx context.Context, req *pb.WatchRequest, stream pb.Rout Network: event.Route.Network, Router: event.Route.Router, Link: event.Route.Link, - Metric: int64(event.Route.Metric), + Metric: event.Route.Metric, } tableEvent := &pb.Event{ diff --git a/router/handler/table.go b/router/handler/table.go index 899a2795..bf972efb 100644 --- a/router/handler/table.go +++ b/router/handler/table.go @@ -20,7 +20,7 @@ func (t *Table) Create(ctx context.Context, route *pb.Route, resp *pb.CreateResp Network: route.Network, Router: route.Router, Link: route.Link, - Metric: int(route.Metric), + Metric: route.Metric, }) if err != nil { return errors.InternalServerError("go.micro.router", "failed to create route: %s", err) @@ -37,7 +37,7 @@ func (t *Table) Update(ctx context.Context, route *pb.Route, resp *pb.UpdateResp Network: route.Network, Router: route.Router, Link: route.Link, - Metric: int(route.Metric), + Metric: route.Metric, }) if err != nil { return errors.InternalServerError("go.micro.router", "failed to update route: %s", err) @@ -54,7 +54,7 @@ func (t *Table) Delete(ctx context.Context, route *pb.Route, resp *pb.DeleteResp Network: route.Network, Router: route.Router, Link: route.Link, - Metric: int(route.Metric), + Metric: route.Metric, }) if err != nil { return errors.InternalServerError("go.micro.router", "failed to delete route: %s", err) @@ -79,7 +79,7 @@ func (t *Table) List(ctx context.Context, req *pb.Request, resp *pb.ListResponse Network: route.Network, Router: route.Router, Link: route.Link, - Metric: int64(route.Metric), + Metric: route.Metric, } respRoutes = append(respRoutes, respRoute) } @@ -104,7 +104,7 @@ func (t *Table) Query(ctx context.Context, req *pb.QueryRequest, resp *pb.QueryR Network: route.Network, Router: route.Router, Link: route.Link, - Metric: int64(route.Metric), + Metric: route.Metric, } respRoutes = append(respRoutes, respRoute) } diff --git a/router/route.go b/router/route.go index f2768403..ed384e7c 100644 --- a/router/route.go +++ b/router/route.go @@ -8,9 +8,7 @@ var ( // DefaultLink is default network link DefaultLink = "local" // DefaultLocalMetric is default route cost for a local route - DefaultLocalMetric = 1 - // DefaultNetworkMetric is default route cost for a network route - DefaultNetworkMetric = 10 + DefaultLocalMetric int64 = 1 ) // Route is network route @@ -28,7 +26,7 @@ type Route struct { // Link is network link Link string // Metric is the route cost metric - Metric int + Metric int64 } // Hash returns route hash sum. diff --git a/router/service/service.go b/router/service/service.go index 068d0ae3..4f9dcb9b 100644 --- a/router/service/service.go +++ b/router/service/service.go @@ -132,7 +132,7 @@ func (s *svc) advertiseEvents(advertChan chan *router.Advert, stream pb.Router_A Gateway: event.Route.Gateway, Network: event.Route.Network, Link: event.Route.Link, - Metric: int(event.Route.Metric), + Metric: event.Route.Metric, } events[i] = &router.Event{ @@ -196,7 +196,7 @@ func (s *svc) Process(advert *router.Advert) error { Gateway: event.Route.Gateway, Network: event.Route.Network, Link: event.Route.Link, - Metric: int64(event.Route.Metric), + Metric: event.Route.Metric, } e := &pb.Event{ Type: pb.EventType(event.Type), @@ -346,7 +346,7 @@ func (s *svc) Lookup(q ...router.QueryOption) ([]router.Route, error) { Gateway: route.Gateway, Network: route.Network, Link: route.Link, - Metric: int(route.Metric), + Metric: route.Metric, } } diff --git a/router/service/table.go b/router/service/table.go index 940fbd41..77e288db 100644 --- a/router/service/table.go +++ b/router/service/table.go @@ -21,7 +21,7 @@ func (t *table) Create(r router.Route) error { Gateway: r.Gateway, Network: r.Network, Link: r.Link, - Metric: int64(r.Metric), + Metric: r.Metric, } if _, err := t.table.Create(context.Background(), route, t.callOpts...); err != nil { @@ -39,7 +39,7 @@ func (t *table) Delete(r router.Route) error { Gateway: r.Gateway, Network: r.Network, Link: r.Link, - Metric: int64(r.Metric), + Metric: r.Metric, } if _, err := t.table.Delete(context.Background(), route, t.callOpts...); err != nil { @@ -57,7 +57,7 @@ func (t *table) Update(r router.Route) error { Gateway: r.Gateway, Network: r.Network, Link: r.Link, - Metric: int64(r.Metric), + Metric: r.Metric, } if _, err := t.table.Update(context.Background(), route, t.callOpts...); err != nil { @@ -82,7 +82,7 @@ func (t *table) List() ([]router.Route, error) { Gateway: route.Gateway, Network: route.Network, Link: route.Link, - Metric: int(route.Metric), + Metric: route.Metric, } } @@ -115,7 +115,7 @@ func (t *table) Query(q ...router.QueryOption) ([]router.Route, error) { Gateway: route.Gateway, Network: route.Network, Link: route.Link, - Metric: int(route.Metric), + Metric: route.Metric, } } diff --git a/router/service/watcher.go b/router/service/watcher.go index 01124473..616dc2d4 100644 --- a/router/service/watcher.go +++ b/router/service/watcher.go @@ -61,7 +61,7 @@ func (w *watcher) watch(stream pb.Router_WatchService) error { Gateway: resp.Route.Gateway, Network: resp.Route.Network, Link: resp.Route.Link, - Metric: int(resp.Route.Metric), + Metric: resp.Route.Metric, } event := &router.Event{