From 7a27e24447cf519796cb39532e719ed66f6bcb3d Mon Sep 17 00:00:00 2001 From: Chengqian Liu Date: Wed, 25 Jul 2018 21:29:02 +0800 Subject: [PATCH] Reduce qos rpc times on the ovs-agent side When multiple ports are bound to qos-policy with the same id, ovs-agent should check whether the cache has policy information instead of directly reading rpc when processing the port. Change-Id: I88f9f5af95439f1536799169390764c89109f467 Closes-Bug: #1783559 --- neutron/agent/l2/extensions/qos.py | 3 ++- .../unit/agent/l2/extensions/test_qos.py | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/neutron/agent/l2/extensions/qos.py b/neutron/agent/l2/extensions/qos.py index 4e4b83ebb33..0a70fb5ea59 100644 --- a/neutron/agent/l2/extensions/qos.py +++ b/neutron/agent/l2/extensions/qos.py @@ -257,7 +257,8 @@ class QosAgentExtension(l2_extension.L2AgentExtension): if not self.policy_map.has_policy_changed(port, qos_policy_id): return - qos_policy = self.resource_rpc.pull( + qos_policy = self.policy_map.get_policy( + qos_policy_id) or self.resource_rpc.pull( context, resources.QOS_POLICY, qos_policy_id) if qos_policy is None: LOG.info("QoS policy %(qos_policy_id)s applied to port " diff --git a/neutron/tests/unit/agent/l2/extensions/test_qos.py b/neutron/tests/unit/agent/l2/extensions/test_qos.py index b0369b4b5b1..afe47cc13e3 100644 --- a/neutron/tests/unit/agent/l2/extensions/test_qos.py +++ b/neutron/tests/unit/agent/l2/extensions/test_qos.py @@ -291,6 +291,28 @@ class QosExtensionRpcTestCase(QosExtensionBaseTestCase): self.context, resources.QOS_POLICY, port['qos_policy_id']) + def test_handle_diff_ports_same_policy_id(self): + port_obj1 = self._create_test_port_dict() + port_obj2 = self._create_test_port_dict() + + self.qos_ext.handle_port(self.context, port_obj1) + self.pull_mock.assert_called_once_with( + self.context, resources.QOS_POLICY, + port_obj1['qos_policy_id']) + self.assertIsNotNone( + self.qos_ext.policy_map.get_port_policy(port_obj1)) + self.assertIsNone( + self.qos_ext.policy_map.get_port_policy(port_obj2)) + + self.qos_ext.resource_rpc.pull.reset_mock() + self.qos_ext.handle_port(self.context, port_obj2) + self.assertFalse(self.pull_mock.called) + self.assertIsNotNone( + self.qos_ext.policy_map.get_port_policy(port_obj2)) + self.assertEqual( + self.qos_ext.policy_map.get_port_policy(port_obj1), + self.qos_ext.policy_map.get_port_policy(port_obj2)) + def test_delete_known_port(self): port = self._create_test_port_dict() self.qos_ext.handle_port(self.context, port)