From 540d00f68ecf1c11b0296922f965ef60d15d1a86 Mon Sep 17 00:00:00 2001 From: Darragh O'Reilly Date: Thu, 7 Mar 2019 14:33:26 +0000 Subject: [PATCH] Make OVS controller inactivity_probe configurable This parameter applies to the OVSDB Controller table when the native openflow driver is used. There are reports that increasing it can reduce errors on busy systems. This patch also sets the default value to 10s which is more than the OVS default of 5s. See the ovs-vswitchd.conf.db man page for full description. Change-Id: If0d42919412dac75deb4d7f484c42cea630fbc59 Partial-Bug: #1817022 --- neutron/agent/common/ovs_lib.py | 7 +++++++ neutron/conf/plugins/ml2/drivers/ovs_conf.py | 5 +++++ .../openvswitch/agent/openflow/native/ovs_bridge.py | 1 + neutron/tests/functional/agent/common/test_ovs_lib.py | 8 ++++++++ .../agent/openflow/native/ovs_bridge_test_base.py | 9 ++++++--- ...e-inactivity-probe-configurable-39d669014d961c5c.yaml | 7 +++++++ 6 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/ovs-make-inactivity-probe-configurable-39d669014d961c5c.yaml diff --git a/neutron/agent/common/ovs_lib.py b/neutron/agent/common/ovs_lib.py index 0987ab78217..f9661b41c44 100644 --- a/neutron/agent/common/ovs_lib.py +++ b/neutron/agent/common/ovs_lib.py @@ -687,6 +687,13 @@ class OVSBridge(BaseOVS): """ self.set_controller_field('connection_mode', connection_mode) + def set_controllers_inactivity_probe(self, interval): + """Set bridge controllers inactivity probe interval. + + :param interval: inactivity_probe value in seconds. + """ + self.set_controller_field('inactivity_probe', interval * 1000) + def _set_egress_bw_limit_for_port(self, port_name, max_kbps, max_burst_kbps): with self.ovsdb.transaction(check_error=True) as txn: diff --git a/neutron/conf/plugins/ml2/drivers/ovs_conf.py b/neutron/conf/plugins/ml2/drivers/ovs_conf.py index d02b80deb49..d1dac485204 100644 --- a/neutron/conf/plugins/ml2/drivers/ovs_conf.py +++ b/neutron/conf/plugins/ml2/drivers/ovs_conf.py @@ -121,6 +121,11 @@ ovs_opts = [ help=_("Timeout in seconds to wait for a single " "OpenFlow request. " "Used only for 'native' driver.")), + cfg.IntOpt('of_inactivity_probe', default=10, + help=_("The inactivity_probe interval in seconds for the local " + "switch connection to the controller. " + "A value of 0 disables inactivity probes. " + "Used only for 'native' driver.")), ] agent_opts = [ diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge.py b/neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge.py index 56a17f6352e..52fb05f4079 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge.py @@ -94,6 +94,7 @@ class OVSAgentBridge(ofswitch.OpenFlowSwitchMixin, # # [1] https://github.com/openvswitch/ovs/blob/master/DESIGN.md self.set_controllers_connection_mode("out-of-band") + self.set_controllers_inactivity_probe(conf.OVS.of_inactivity_probe) def drop_port(self, in_port): self.install_drop(priority=2, in_port=in_port) diff --git a/neutron/tests/functional/agent/common/test_ovs_lib.py b/neutron/tests/functional/agent/common/test_ovs_lib.py index 71c94995f13..b39f7d219b9 100644 --- a/neutron/tests/functional/agent/common/test_ovs_lib.py +++ b/neutron/tests/functional/agent/common/test_ovs_lib.py @@ -429,3 +429,11 @@ class BaseOVSTestCase(base.BaseSudoTestCase): self.ovs.update_minimum_bandwidth_queue(self.port_id, [], 1, 2800) self._check_value(2800, self.ovs.get_egress_min_bw_for_port, port_id=self.port_id) + + def test_set_controllers_inactivity_probe(self): + self._create_bridge() + self.ovs.set_controller(['tcp:127.0.0.1:6633']) + self.ovs.set_controllers_inactivity_probe(8) + self.assertEqual(8000, + self.ovs.db_get_val('Controller', self.br_name, + 'inactivity_probe')) diff --git a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge_test_base.py b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge_test_base.py index e613d5c1265..20b48aac003 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge_test_base.py +++ b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/native/ovs_bridge_test_base.py @@ -142,12 +142,15 @@ class OVSBridgeTestBase(ovs_test_base.OVSOSKenTestBase): m_add_protocols = mock.patch.object(self.br, 'add_protocols') m_set_controller = mock.patch.object(self.br, 'set_controller') + m_set_probe = mock.patch.object(self.br, + 'set_controllers_inactivity_probe') m_set_ccm = mock.patch.object(self.br, 'set_controllers_connection_mode') - with m_set_ccm as set_ccm, m_set_controller, m_add_protocols: - self.br.setup_controllers(cfg) - set_ccm.assert_called_once_with("out-of-band") + with m_set_ccm as set_ccm: + with m_set_controller, m_add_protocols, m_set_probe: + self.br.setup_controllers(cfg) + set_ccm.assert_called_once_with("out-of-band") class OVSDVRProcessTestMixin(object): diff --git a/releasenotes/notes/ovs-make-inactivity-probe-configurable-39d669014d961c5c.yaml b/releasenotes/notes/ovs-make-inactivity-probe-configurable-39d669014d961c5c.yaml new file mode 100644 index 00000000000..3467854f79a --- /dev/null +++ b/releasenotes/notes/ovs-make-inactivity-probe-configurable-39d669014d961c5c.yaml @@ -0,0 +1,7 @@ +--- +other: + - | + A new option ``[ovs] of_inactivity_probe`` has been added to allow + changing the inactivity probe interval when using the OVS ML2 agent + with the native OpenFlow driver. Operators can increase this if they + are experiencing OpenFlow timeouts. The default value is 10 seconds.