]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Return from check_ports_exist_on_l3agent if no subnet found
authorEd Bak <ed.bak2@hp.com>
Mon, 9 Feb 2015 23:13:18 +0000 (23:13 +0000)
committerEd Bak <ed.bak2@hp.com>
Tue, 7 Apr 2015 14:03:19 +0000 (14:03 +0000)
The call to get_subnet_ids_on_router can return an empty list.
If the subnet_ids list is empty, the subsequent call to get
the ports on a subnet returns all ports.  If this occurs
when doing a remove_router_interface, the performance
of a remove_router_interface degrades significantly.  This change
returns immediately from check_ports_exist_on_l3agents if no
subnet is found.  A new unit test has been added to cover
the specific case of returning immediately without calling
get_ports when a remove_router_interface operation is performed.

Change-Id: I247d3bae152ab4f8ab7e00bd24d878eb08dca1ba
Closes-Bug: #1420032
Depends-On: I15bbf16fd4378c6431e9da8942d0968e7a012a91

neutron/db/l3_agentschedulers_db.py
neutron/tests/unit/scheduler/test_l3_agent_scheduler.py

index cbcee9a47ddacabf7f7e3e94d9bf1b181d06626c..931436bddcbcea121799ed9d0c78347fa763847e 100644 (file)
@@ -375,6 +375,8 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
         ports on the host, running the input l3agent.
         """
         subnet_ids = self.get_subnet_ids_on_router(context, router_id)
+        if not subnet_ids:
+            return False
 
         core_plugin = manager.NeutronManager.get_plugin()
         filter = {'fixed_ips': {'subnet_id': subnet_ids}}
index 267eceefa328ccb292cc7aa5e81b349b3863e053..a68d2e70874f00f03bff1d74a3008a4607db28df 100644 (file)
@@ -671,6 +671,17 @@ class L3SchedulerTestBaseMixin(object):
                                                 l3_agent, router['id'])
         self.assertFalse(val)
 
+    def test_check_ports_exist_on_l3agent_if_no_subnets_then_return(self):
+        l3_agent, router = self._prepare_check_ports_exist_tests()
+        with mock.patch.object(manager.NeutronManager,
+                               'get_plugin') as getp:
+            getp.return_value = self.plugin
+            # no subnets and operation is remove_router_interface,
+            # so return immediately without calling get_ports
+            self.check_ports_exist_on_l3agent(self.adminContext,
+                                          l3_agent, router['id'])
+        self.assertFalse(self.plugin.get_ports.called)
+
     def test_check_ports_exist_on_l3agent_no_subnet_match(self):
         l3_agent, router = self._prepare_check_ports_exist_tests()
         # no matching subnet
@@ -688,7 +699,7 @@ class L3SchedulerTestBaseMixin(object):
                 'device_owner': 'compute:',
                 'id': 1234}
         self.plugin.get_ports.return_value = [port]
-        self.plugin.get_subnet_ids_on_router = mock.Mock(
+        self.get_subnet_ids_on_router = mock.Mock(
             return_value=[port['subnet_id']])
         val = self.check_ports_exist_on_l3agent(self.adminContext,
                                                 l3_agent, router['id'])