Add router advertisement Strategy option to router.

This commit is contained in:
Milos Gajdos 2019-10-09 16:03:06 +01:00
parent fe94237448
commit 96e564e402
No known key found for this signature in database
GPG Key ID: 8B31058CC55DFD4F
3 changed files with 26 additions and 14 deletions

View File

@ -319,23 +319,13 @@ func (r *router) advertiseTable() error {
for {
select {
case <-ticker.C:
// list routing table routes to announce
routes, err := r.table.List()
// do full table flush
events, err := r.flushRouteEvents(Update)
if err != nil {
return fmt.Errorf("failed listing routes: %s", err)
}
// collect all the added routes before we attempt to add default gateway
events := make([]*Event, len(routes))
for i, route := range routes {
event := &Event{
Type: Update,
Timestamp: time.Now(),
Route: route,
}
events[i] = event
return fmt.Errorf("failed flushing routes: %s", err)
}
// advertise all routes as Update events to subscribers
// advertise routes to subscribers
if len(events) > 0 {
log.Debugf("Router flushing table with %d events: %s", len(events), r.options.Id)
r.advertWg.Add(1)
@ -692,6 +682,9 @@ func (r *router) flushRouteEvents(evType EventType) ([]*Event, error) {
return nil, fmt.Errorf("failed listing routes: %s", err)
}
// TODO: flush the routes based on strategy here
// - collapse the routes per service-metric-locality (prefer your routes)
// build a list of events to advertise
events := make([]*Event, len(routes))
for i, route := range routes {

View File

@ -18,6 +18,8 @@ type Options struct {
Network string
// Registry is the local registry
Registry registry.Registry
// Advertise is the advertising strategy
Advertise Strategy
// Client for calling router
Client client.Client
}
@ -64,6 +66,13 @@ func Registry(r registry.Registry) Option {
}
}
// Strategy sets route advertising strategy
func Advertise(a Strategy) Option {
return func(o *Options) {
o.Advertise = a
}
}
// DefaultOptions returns router default options
func DefaultOptions() Options {
return Options{

View File

@ -139,6 +139,16 @@ type Advert struct {
Events []*Event
}
// Strategy is route advertisement strategy
type Strategy int
const (
// All advertises all routes to the network
All Strategy = iota
// Optimal advertises optimal routes to the network
Optimal
)
// NewRouter creates new Router and returns it
func NewRouter(opts ...Option) Router {
return newRouter(opts...)