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 { for {
select { select {
case <-ticker.C: case <-ticker.C:
// list routing table routes to announce // do full table flush
routes, err := r.table.List() events, err := r.flushRouteEvents(Update)
if err != nil { if err != nil {
return fmt.Errorf("failed listing routes: %s", err) return fmt.Errorf("failed flushing 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
} }
// advertise all routes as Update events to subscribers // advertise routes to subscribers
if len(events) > 0 { if len(events) > 0 {
log.Debugf("Router flushing table with %d events: %s", len(events), r.options.Id) log.Debugf("Router flushing table with %d events: %s", len(events), r.options.Id)
r.advertWg.Add(1) 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) 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 // 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 {

View File

@ -18,6 +18,8 @@ type Options struct {
Network string Network string
// Registry is the local registry // Registry is the local registry
Registry registry.Registry Registry registry.Registry
// Advertise is the advertising strategy
Advertise Strategy
// Client for calling router // Client for calling router
Client client.Client 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 // DefaultOptions returns router default options
func DefaultOptions() Options { func DefaultOptions() Options {
return Options{ return Options{

View File

@ -139,6 +139,16 @@ type Advert struct {
Events []*Event 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 // NewRouter creates new Router and returns it
func NewRouter(opts ...Option) Router { func NewRouter(opts ...Option) Router {
return newRouter(opts...) return newRouter(opts...)