]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Decrease rpc timeout after agent receives SIGTERM
authorJakub Libosvar <libosvar@redhat.com>
Fri, 30 Jan 2015 17:30:22 +0000 (18:30 +0100)
committerJakub Libosvar <libosvar@redhat.com>
Tue, 3 Feb 2015 11:38:09 +0000 (12:38 +0100)
The patch sets different timeout to rpc api objects in OVS agent after
SIGTERM is received. Given timeout is configurable. This action prevents
long waiting for rpc call() methods to timeout and decreases amount of time
needed to successfully stopping OVS agent.

DocImpact
Change-Id: I3026775e813a74bad9e0bca3be1f535212a2e417
Closes-Bug: 1408334

etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
neutron/plugins/openvswitch/agent/ovs_neutron_agent.py
neutron/plugins/openvswitch/common/config.py
neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py

index 515fc1fce86c0d5d5da2684f82161c9fa32df3be..7196b9a9c747b6989e57ff58651720dc95dce8bc 100644 (file)
 #
 # enable_distributed_routing = False
 
+# (IntOpt) Set new timeout in seconds for new rpc calls after agent receives
+# SIGTERM. If value is set to 0, rpc timeout won't be changed"
+#
+# quitting_rpc_timeout = 10
+
 [securitygroup]
 # Firewall driver for realizing neutron security group function.
 # firewall_driver = neutron.agent.firewall.NoopFirewallDriver
index 6a39c0583ddce71b6b881247bf6883a9f78f6a63..0fd5529f6bfeac5cd2395b6b1edc0b9c5dd32c7a 100644 (file)
@@ -130,7 +130,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin,
                  ovsdb_monitor_respawn_interval=(
                      constants.DEFAULT_OVSDBMON_RESPAWN),
                  arp_responder=False,
-                 use_veth_interconnection=False):
+                 use_veth_interconnection=False,
+                 quitting_rpc_timeout=None):
         '''Constructor.
 
         :param integ_br: name of the integration bridge.
@@ -153,6 +154,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin,
                supported.
         :param use_veth_interconnection: use veths instead of patch ports to
                interconnect the integration bridge to physical bridges.
+        :param quitting_rpc_timeout: timeout in seconds for rpc calls after
+               SIGTERM is received
         '''
         super(OVSNeutronAgent, self).__init__()
         self.use_veth_interconnection = use_veth_interconnection
@@ -252,6 +255,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin,
         # The initialization is complete; we can start receiving messages
         self.connection.consume_in_threads()
 
+        self.quitting_rpc_timeout = quitting_rpc_timeout
+
     def _report_state(self):
         # How many devices are likely used by a VM
         self.agent_state.get('configurations')['devices'] = (
@@ -1502,6 +1507,13 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin,
     def _handle_sigterm(self, signum, frame):
         LOG.debug("Agent caught SIGTERM, quitting daemon loop.")
         self.run_daemon_loop = False
+        if self.quitting_rpc_timeout:
+            self.set_rpc_timeout(self.quitting_rpc_timeout)
+
+    def set_rpc_timeout(self, timeout):
+        for rpc_api in (self.plugin_rpc, self.sg_plugin_rpc,
+                        self.dvr_plugin_rpc, self.state_rpc):
+            rpc_api.client.timeout = timeout
 
 
 def _ofport_set_to_str(ofport_set):
@@ -1533,6 +1545,7 @@ def create_agent_config_map(config):
         l2_population=config.AGENT.l2_population,
         arp_responder=config.AGENT.arp_responder,
         use_veth_interconnection=config.OVS.use_veth_interconnection,
+        quitting_rpc_timeout=config.AGENT.quitting_rpc_timeout
     )
 
     # Verify the tunnel_types specified are valid
index a5d1e92cfc143a0b2093b8c9ea44a9918b0b50a8..a46309518e800ad2390234fec3f2f20c7c83d134 100644 (file)
@@ -79,6 +79,10 @@ agent_opts = [
                        "outgoing IP packet carrying GRE/VXLAN tunnel.")),
     cfg.BoolOpt('enable_distributed_routing', default=False,
                 help=_("Make the l2 agent run in DVR mode.")),
+    cfg.IntOpt('quitting_rpc_timeout', default=10,
+               help=_("Set new timeout in seconds for new rpc calls after "
+                      "agent receives SIGTERM. If value is set to 0, rpc "
+                      "timeout won't be changed"))
 ]
 
 
index baa71b1a6c44ee813fea0959c3ac498d0f9221e9..56ec3139f2a7ac9aec5859163d804ec21f034ee3 100644 (file)
@@ -100,6 +100,7 @@ class TestOvsNeutronAgent(base.BaseTestCase):
         cfg.CONF.set_default('firewall_driver',
                              'neutron.agent.firewall.NoopFirewallDriver',
                              group='SECURITYGROUP')
+        cfg.CONF.set_default('quitting_rpc_timeout', 10, 'AGENT')
         kwargs = ovs_neutron_agent.create_agent_config_map(cfg.CONF)
 
         class MockFixedIntervalLoopingCall(object):
@@ -1616,6 +1617,20 @@ class TestOvsNeutronAgent(base.BaseTestCase):
         setup_int_br.assert_has_calls([mock.call()])
         setup_phys_br.assert_has_calls([mock.call({})])
 
+    def test_set_rpc_timeout(self):
+        self.agent._handle_sigterm(None, None)
+        for rpc_client in (self.agent.plugin_rpc.client,
+                           self.agent.sg_plugin_rpc.client,
+                           self.agent.dvr_plugin_rpc.client,
+                           self.agent.state_rpc.client):
+            self.assertEqual(10, rpc_client.timeout)
+
+    def test_set_rpc_timeout_no_value(self):
+        self.agent.quitting_rpc_timeout = None
+        with mock.patch.object(self.agent, 'set_rpc_timeout') as mock_set_rpc:
+            self.agent._handle_sigterm(None, None)
+        self.assertFalse(mock_set_rpc.called)
+
 
 class AncillaryBridgesTest(base.BaseTestCase):