From 2a6ca3ccc7f0657c561aa45755faf21500ebd3d7 Mon Sep 17 00:00:00 2001 From: Ananth Suryanarayana Date: Tue, 21 Jun 2016 15:14:19 -0700 Subject: [PATCH] Add life time references to all referred tables from service chain Also Shutdown the work queue before deletion Closes-Bug: #1594987 Change-Id: I1ce17ccb8c62fa6d2ce0920a1ddabdd289ad6744 --- src/bgp/routing-instance/service_chaining.cc | 10 ++++++---- src/bgp/routing-instance/service_chaining.h | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/bgp/routing-instance/service_chaining.cc b/src/bgp/routing-instance/service_chaining.cc index c9951654420..813de958b6f 100644 --- a/src/bgp/routing-instance/service_chaining.cc +++ b/src/bgp/routing-instance/service_chaining.cc @@ -69,7 +69,9 @@ ServiceChain::ServiceChain(ServiceChainMgrT *manager, RoutingInstance *src, connected_table_unregistered_(false), dest_table_unregistered_(false), aggregate_(false), - src_table_delete_ref_(this, src_table()->deleter()) { + src_table_delete_ref_(this, src_table()->deleter()), + dest_table_delete_ref_(this, dest_table()->deleter()), + connected_table_delete_ref_(this, connected_table()->deleter()) { for (vector::const_iterator it = subnets.begin(); it != subnets.end(); ++it) { error_code ec; @@ -904,9 +906,9 @@ ServiceChainMgr::ServiceChainMgr(BgpServer *server) service_chain_task_id_ = scheduler->GetTaskId("bgp::ServiceChain"); } - process_queue_ = + process_queue_.reset( new WorkQueue(service_chain_task_id_, 0, - bind(&ServiceChainMgr::RequestHandler, this, _1)); + bind(&ServiceChainMgr::RequestHandler, this, _1))); id_ = server->routing_instance_mgr()->RegisterInstanceOpCallback( bind(&ServiceChainMgr::RoutingInstanceCallback, this, _1, _2)); @@ -918,7 +920,7 @@ ServiceChainMgr::ServiceChainMgr(BgpServer *server) template ServiceChainMgr::~ServiceChainMgr() { - delete process_queue_; + process_queue_->Shutdown(); server_->routing_instance_mgr()->UnregisterInstanceOpCallback(id_); BgpMembershipManager *membership_mgr = server_->membership_mgr(); membership_mgr->UnregisterPeerRegistrationCallback(registration_id_); diff --git a/src/bgp/routing-instance/service_chaining.h b/src/bgp/routing-instance/service_chaining.h index 240fb117e51..1103f9838d0 100644 --- a/src/bgp/routing-instance/service_chaining.h +++ b/src/bgp/routing-instance/service_chaining.h @@ -215,6 +215,8 @@ class ServiceChain : public ConditionMatch { bool dest_table_unregistered_; bool aggregate_; // Whether the host route needs to be aggregated LifetimeRef src_table_delete_ref_; + LifetimeRef dest_table_delete_ref_; + LifetimeRef connected_table_delete_ref_; // Helper function to match bool IsMoreSpecific(BgpRoute *route, PrefixT *aggregate_match) const; @@ -309,7 +311,7 @@ class ServiceChainMgr : public IServiceChainMgr { BgpServer *server_; BgpConditionListener *listener_; boost::scoped_ptr resolve_trigger_; - WorkQueue *process_queue_; + boost::scoped_ptr > process_queue_; bool aggregate_host_route_; ServiceChainMap chain_set_; PendingServiceChainList pending_chains_;