summaryrefslogtreecommitdiffhomepage
path: root/pkg
diff options
context:
space:
mode:
authorAlistair King <alistair@kentik.com>2020-11-03 11:44:13 -0500
committerFUJITA Tomonori <fujita.tomonori@gmail.com>2020-11-06 21:08:55 +0900
commit5c979fea68b6000ec5339fe85dfbf21bc3977921 (patch)
treec88af87aa4d69931e1ec9829e53bdafd63503520 /pkg
parent7ce0dddd4f49307540b13024168310c237d28c2f (diff)
Use MonitorTableRequest.Name to filter by peer
Filter returned Paths based on provided peer address (similar to GetTable). This should improve performance when using MonitorTable with ADJ_IN and Current for a single peer.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/server/bmp.go4
-rw-r--r--pkg/server/mrt.go2
-rw-r--r--pkg/server/server.go24
-rw-r--r--pkg/server/zclient.go2
4 files changed, 23 insertions, 9 deletions
diff --git a/pkg/server/bmp.go b/pkg/server/bmp.go
index 22be03ae..839dd786 100644
--- a/pkg/server/bmp.go
+++ b/pkg/server/bmp.go
@@ -122,10 +122,10 @@ func (b *bmpClient) loop() {
).Warn("both option for route-monitoring-policy is obsoleted")
}
if b.c.RouteMonitoringPolicy == config.BMP_ROUTE_MONITORING_POLICY_TYPE_PRE_POLICY || b.c.RouteMonitoringPolicy == config.BMP_ROUTE_MONITORING_POLICY_TYPE_ALL {
- ops = append(ops, watchUpdate(true))
+ ops = append(ops, watchUpdate(true, ""))
}
if b.c.RouteMonitoringPolicy == config.BMP_ROUTE_MONITORING_POLICY_TYPE_POST_POLICY || b.c.RouteMonitoringPolicy == config.BMP_ROUTE_MONITORING_POLICY_TYPE_ALL {
- ops = append(ops, watchPostUpdate(true))
+ ops = append(ops, watchPostUpdate(true, ""))
}
if b.c.RouteMonitoringPolicy == config.BMP_ROUTE_MONITORING_POLICY_TYPE_LOCAL_RIB || b.c.RouteMonitoringPolicy == config.BMP_ROUTE_MONITORING_POLICY_TYPE_ALL {
ops = append(ops, watchBestPath(true))
diff --git a/pkg/server/mrt.go b/pkg/server/mrt.go
index 773f0ea5..6ce64c14 100644
--- a/pkg/server/mrt.go
+++ b/pkg/server/mrt.go
@@ -51,7 +51,7 @@ func (m *mrtWriter) loop() error {
ops := []watchOption{}
switch m.c.DumpType {
case config.MRT_TYPE_UPDATES:
- ops = append(ops, watchUpdate(false))
+ ops = append(ops, watchUpdate(false, ""))
case config.MRT_TYPE_TABLE:
if len(m.c.TableName) > 0 {
ops = append(ops, watchTableName(m.c.TableName))
diff --git a/pkg/server/server.go b/pkg/server/server.go
index 274f7177..ee58585f 100644
--- a/pkg/server/server.go
+++ b/pkg/server/server.go
@@ -3689,9 +3689,9 @@ func (s *BgpServer) MonitorTable(ctx context.Context, r *api.MonitorTableRequest
return s.watch(watchBestPath(r.Current)), nil
case api.TableType_ADJ_IN:
if r.PostPolicy {
- return s.watch(watchPostUpdate(r.Current)), nil
+ return s.watch(watchPostUpdate(r.Current, r.Name)), nil
}
- return s.watch(watchUpdate(r.Current)), nil
+ return s.watch(watchUpdate(r.Current, r.Name)), nil
default:
return nil, fmt.Errorf("unsupported resource type: %v", r.TableType)
}
@@ -3731,6 +3731,9 @@ func (s *BgpServer) MonitorTable(ctx context.Context, r *api.MonitorTableRequest
if path == nil || (r.Family != nil && family != path.GetRouteFamily()) {
continue
}
+ if len(r.Name) > 0 && r.Name != path.GetSource().Address.String() {
+ continue
+ }
select {
case <-ctx.Done():
return
@@ -3879,6 +3882,7 @@ type watchOptions struct {
initPeerState bool
tableName string
recvMessage bool
+ peerAddress string
}
type watchOption func(*watchOptions)
@@ -3892,21 +3896,23 @@ func watchBestPath(current bool) watchOption {
}
}
-func watchUpdate(current bool) watchOption {
+func watchUpdate(current bool, peerAddress string) watchOption {
return func(o *watchOptions) {
o.preUpdate = true
if current {
o.initUpdate = true
}
+ o.peerAddress = peerAddress
}
}
-func watchPostUpdate(current bool) watchOption {
+func watchPostUpdate(current bool, peerAddress string) watchOption {
return func(o *watchOptions) {
o.postUpdate = true
if current {
o.initPostUpdate = true
}
+ o.peerAddress = peerAddress
}
}
@@ -4088,10 +4094,14 @@ func (s *BgpServer) watch(opts ...watchOption) (w *watcher) {
for _, peer := range s.neighborMap {
peer.fsm.lock.RLock()
notEstablished := peer.fsm.state != bgp.BGP_FSM_ESTABLISHED
+ peerAddress := peer.fsm.peerInfo.Address.String()
peer.fsm.lock.RUnlock()
if notEstablished {
continue
}
+ if len(w.opts.peerAddress) > 0 && w.opts.peerAddress != peerAddress {
+ continue
+ }
configNeighbor := w.s.toConfig(peer, false)
for _, rf := range peer.configuredRFlist() {
peer.fsm.lock.RLock()
@@ -4146,9 +4156,13 @@ func (s *BgpServer) watch(opts ...watchOption) (w *watcher) {
for peerInfo, paths := range pathsByPeer {
// create copy which can be access to without mutex
var configNeighbor *config.Neighbor
- if peer, ok := s.neighborMap[peerInfo.Address.String()]; ok {
+ peerAddress := peerInfo.Address.String()
+ if peer, ok := s.neighborMap[peerAddress]; ok {
configNeighbor = w.s.toConfig(peer, false)
}
+ if w.opts.peerAddress != "" && w.opts.peerAddress != peerAddress {
+ continue
+ }
w.notify(&watchEventUpdate{
PeerAS: peerInfo.AS,
diff --git a/pkg/server/zclient.go b/pkg/server/zclient.go
index 5dac2a30..645cb0f4 100644
--- a/pkg/server/zclient.go
+++ b/pkg/server/zclient.go
@@ -364,7 +364,7 @@ func (z *zebraClient) updatePathByNexthopCache(paths []*table.Path) {
func (z *zebraClient) loop() {
w := z.server.watch([]watchOption{
watchBestPath(true),
- watchPostUpdate(true),
+ watchPostUpdate(true, ""),
}...)
defer w.Stop()