Make Optimal strategy default. Collapse routing tables based on strategy
This commit is contained in:
		| @@ -682,9 +682,11 @@ func (r *router) flushRouteEvents(evType EventType) ([]*Event, error) { | |||||||
| 		return nil, fmt.Errorf("failed listing routes: %s", err) | 		return nil, fmt.Errorf("failed listing routes: %s", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// TODO: flush the routes based on strategy here | 	r.RLock() | ||||||
| 	// - collapse the routes per service-metric-locality (prefer your routes) | 	advertStrategy := r.options.Advertise | ||||||
|  | 	r.RUnlock() | ||||||
|  |  | ||||||
|  | 	if advertStrategy == All { | ||||||
| 		// build a list of events to advertise | 		// build a list of events to advertise | ||||||
| 		events := make([]*Event, len(routes)) | 		events := make([]*Event, len(routes)) | ||||||
| 		for i, route := range routes { | 		for i, route := range routes { | ||||||
| @@ -695,6 +697,45 @@ func (r *router) flushRouteEvents(evType EventType) ([]*Event, error) { | |||||||
| 			} | 			} | ||||||
| 			events[i] = event | 			events[i] = event | ||||||
| 		} | 		} | ||||||
|  | 		return events, nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// routeMap stores optimal routes per service | ||||||
|  | 	optimalRoutes := make(map[string]Route) | ||||||
|  |  | ||||||
|  | 	// go through all routes found in the routing table and collapse them to optimal routes | ||||||
|  | 	for _, route := range routes { | ||||||
|  | 		optimal, ok := optimalRoutes[route.Service] | ||||||
|  | 		if !ok { | ||||||
|  | 			optimalRoutes[route.Service] = route | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		// if the current optimal route metric is higher than routing table route, replace it | ||||||
|  | 		if optimal.Metric > route.Metric { | ||||||
|  | 			optimalRoutes[route.Service] = route | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		// if the metrics are the same, prefer advertising your own route | ||||||
|  | 		if optimal.Metric == route.Metric { | ||||||
|  | 			if route.Router == r.options.Id { | ||||||
|  | 				optimalRoutes[route.Service] = route | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// build a list of events to advertise | ||||||
|  | 	events := make([]*Event, len(optimalRoutes)) | ||||||
|  | 	i := 0 | ||||||
|  | 	for _, route := range optimalRoutes { | ||||||
|  | 		event := &Event{ | ||||||
|  | 			Type:      evType, | ||||||
|  | 			Timestamp: time.Now(), | ||||||
|  | 			Route:     route, | ||||||
|  | 		} | ||||||
|  | 		events[i] = event | ||||||
|  | 		i++ | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return events, nil | 	return events, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -80,5 +80,6 @@ func DefaultOptions() Options { | |||||||
| 		Address:   DefaultAddress, | 		Address:   DefaultAddress, | ||||||
| 		Network:   DefaultNetwork, | 		Network:   DefaultNetwork, | ||||||
| 		Registry:  registry.DefaultRegistry, | 		Registry:  registry.DefaultRegistry, | ||||||
|  | 		Advertise: Optimal, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -149,6 +149,18 @@ const ( | |||||||
| 	Optimal | 	Optimal | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // String returns human readable Strategy | ||||||
|  | func (s Strategy) String() string { | ||||||
|  | 	switch s { | ||||||
|  | 	case All: | ||||||
|  | 		return "all" | ||||||
|  | 	case Optimal: | ||||||
|  | 		return "optimal" | ||||||
|  | 	default: | ||||||
|  | 		return "unknown" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // NewRouter creates new Router and returns it | // NewRouter creates new Router and returns it | ||||||
| func NewRouter(opts ...Option) Router { | func NewRouter(opts ...Option) Router { | ||||||
| 	return newRouter(opts...) | 	return newRouter(opts...) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user