From f43128cfa797ec5069c9d74bccc4550b7ddbac84 Mon Sep 17 00:00:00 2001 From: Nischal Sheth Date: Fri, 24 Jun 2016 08:56:41 -0700 Subject: [PATCH] Support large number of routing instances Following changes are implemented: - Use bgp::ShowCommand task for neighbor introspect. This makes the intropsect commands more responsive because they no longer have to run exclusively with db::DBTable tasks. - Fix BgpServer::VisitBgpPeers to not iterate all routing instances. Instead we can simply go through the BgpPeerList in BgpServer. Change-Id: I6557b5f6fb1d00cddbb5072ca97a331c3f9c30fa Partial-Bug: 1596089 --- src/bgp/bgp_server.cc | 9 +++------ src/bgp/bgp_show_neighbor.cc | 8 ++++---- src/bgp/scheduling_group.cc | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/bgp/bgp_server.cc b/src/bgp/bgp_server.cc index f33debca4c8..9fde2254fff 100644 --- a/src/bgp/bgp_server.cc +++ b/src/bgp/bgp_server.cc @@ -554,12 +554,9 @@ uint32_t BgpServer::num_down_static_routes() const { } void BgpServer::VisitBgpPeers(BgpServer::VisitorFn fn) const { - for (RoutingInstanceMgr::RoutingInstanceIterator rit = inst_mgr_->begin(); - rit != inst_mgr_->end(); ++rit) { - BgpPeerKey key = BgpPeerKey(); - while (BgpPeer *peer = rit->peer_manager()->NextPeer(key)) { - fn(peer); - } + for (BgpPeerList::const_iterator loc = peer_list_.begin(); + loc != peer_list_.end(); ++loc) { + fn(loc->second); } } diff --git a/src/bgp/bgp_show_neighbor.cc b/src/bgp/bgp_show_neighbor.cc index 5a4479b1548..1dd141a408b 100644 --- a/src/bgp/bgp_show_neighbor.cc +++ b/src/bgp/bgp_show_neighbor.cc @@ -132,7 +132,7 @@ void BgpNeighborReq::HandleRequest() const { RequestPipeline::StageSpec s1; TaskScheduler *scheduler = TaskScheduler::GetInstance(); - s1.taskId_ = scheduler->GetTaskId("bgp::PeerMembership"); + s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand"); s1.cbFn_ = boost::bind(&BgpShowHandler< BgpNeighborReq, BgpNeighborReqIterate, @@ -156,7 +156,7 @@ void BgpNeighborReqIterate::HandleRequest() const { RequestPipeline::StageSpec s1; TaskScheduler *scheduler = TaskScheduler::GetInstance(); - s1.taskId_ = scheduler->GetTaskId("bgp::PeerMembership"); + s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand"); s1.cbFn_ = boost::bind(&BgpShowHandler< BgpNeighborReq, BgpNeighborReqIterate, @@ -180,7 +180,7 @@ void ShowBgpNeighborSummaryReq::HandleRequest() const { RequestPipeline::StageSpec s1; TaskScheduler *scheduler = TaskScheduler::GetInstance(); - s1.taskId_ = scheduler->GetTaskId("bgp::PeerMembership"); + s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand"); s1.cbFn_ = boost::bind(&BgpShowHandler< ShowBgpNeighborSummaryReq, ShowBgpNeighborSummaryReqIterate, @@ -204,7 +204,7 @@ void ShowBgpNeighborSummaryReqIterate::HandleRequest() const { RequestPipeline::StageSpec s1; TaskScheduler *scheduler = TaskScheduler::GetInstance(); - s1.taskId_ = scheduler->GetTaskId("bgp::PeerMembership"); + s1.taskId_ = scheduler->GetTaskId("bgp::ShowCommand"); s1.cbFn_ = boost::bind(&BgpShowHandler< ShowBgpNeighborSummaryReq, ShowBgpNeighborSummaryReqIterate, diff --git a/src/bgp/scheduling_group.cc b/src/bgp/scheduling_group.cc index dacc1c41f73..cf182901db6 100644 --- a/src/bgp/scheduling_group.cc +++ b/src/bgp/scheduling_group.cc @@ -509,7 +509,7 @@ bool SchedulingGroup::empty() const { // Return true if the IPeer is in sync. // bool SchedulingGroup::PeerInSync(IPeerUpdate *peer) const { - CHECK_CONCURRENCY("bgp::PeerMembership"); + CHECK_CONCURRENCY("bgp::PeerMembership", "bgp::ShowCommand"); PeerState *ps = peer_state_imap_.Find(peer); return (ps) ? ps->in_sync() : false;