]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add option sql_max_retries for database connection.
authorjustin ljj <iamljj@gmail.com>
Mon, 9 Jul 2012 03:11:09 +0000 (11:11 +0800)
committerjustin ljj <iamljj@gmail.com>
Fri, 13 Jul 2012 02:39:57 +0000 (10:39 +0800)
Fixes bug 1019728

also add unit tests for linux bridge plugin config

Change-Id: Ibfea9bac87ba36f301671a35de81577debcd460e

12 files changed:
etc/quantum/plugins/linuxbridge/linuxbridge_conf.ini
etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
quantum/db/api.py
quantum/plugins/linuxbridge/common/config.py
quantum/plugins/linuxbridge/db/l2network_db.py
quantum/plugins/openvswitch/common/config.py
quantum/plugins/openvswitch/ovs_quantum_plugin.py
quantum/plugins/ryu/common/config.py
quantum/plugins/ryu/ovs_quantum_plugin_base.py
quantum/tests/unit/test_lb_config.py
quantum/tests/unit/test_ovs_config.py
quantum/tests/unit/test_ryu_config.py

index b2a3e3b8dcda3e711c41014e0837e55c03f73daa..59dcd138239d9892c2e74d44d8146159ea77cd62 100644 (file)
@@ -9,6 +9,9 @@ vlan_end=3000
 # Replace 127.0.0.1 above with the IP address of the database used by the
 # main quantum server. (Leave it as is if the database runs on this host.)
 sql_connection = sqlite://
+# Database reconnection retry times - in event connectivity is lost
+# set to -1 implies an infinite retry count
+# sql_max_retries = 10
 # Database reconnection interval in seconds - in event connectivity is lost
 reconnect_interval = 2
 
index 44f3fca58d38159470dd90c8c66991b3860a6f9f..b7495dd389156cb484b5eefbe2718ce9b19155fd 100644 (file)
@@ -5,6 +5,9 @@
 # Replace 127.0.0.1 above with the IP address of the database used by the
 # main quantum server. (Leave it as is if the database runs on this host.)
 sql_connection = sqlite://
+# Database reconnection retry times - in event connectivity is lost
+# set to -1 implies an infinite retry count
+# sql_max_retries = 10
 # Database reconnection interval in seconds - in event connectivity is lost
 reconnect_interval = 2
 
index a99762031ebed8de70e6745705e27b571448dfa2..3967fc1bf0ce7d3b2ab5928ef2f923ccc294a375 100644 (file)
@@ -82,7 +82,9 @@ def configure_db(options):
         base = options.get('base', BASE)
         if not register_models(base):
             if 'reconnect_interval' in options:
-                retry_registration(options['reconnect_interval'], base)
+                remaining = options.get('sql_max_retries', -1)
+                reconnect_interval = options['reconnect_interval']
+                retry_registration(remaining, reconnect_interval, base)
 
 
 def clear_db(base=BASE):
@@ -103,10 +105,17 @@ def get_session(autocommit=True, expire_on_commit=False):
     return _MAKER()
 
 
-def retry_registration(reconnect_interval, base=BASE):
+def retry_registration(remaining, reconnect_interval, base=BASE):
+    if remaining == -1:
+        remaining = 'infinite'
     while True:
-        LOG.info("Unable to connect to database. Retrying in %s seconds" %
-                 reconnect_interval)
+        if remaining != 'infinite':
+            if remaining == 0:
+                LOG.error("Database connection lost, exit...")
+                break
+            remaining -= 1
+        LOG.info("Unable to connect to database, %s attempts left. "
+                 "Retrying in %s seconds" % (remaining, reconnect_interval))
         time.sleep(reconnect_interval)
         if register_models(base):
             break
index 7be75b0285486b3e4c7b7fb7ab3c0fa00aa89399..6e2aa9b86c23c4d8bf244bf4b3a625f4ec4652c3 100644 (file)
@@ -27,6 +27,7 @@ vlan_opts = [
 
 database_opts = [
     cfg.StrOpt('sql_connection', default='sqlite://'),
+    cfg.IntOpt('sql_max_retries', default=-1),
     cfg.IntOpt('reconnect_interval', default=2),
 ]
 
index b661c700e0f93b1983c648a83b8a9be296ad742d..8cd4014bda3282b5e655bc31c0dd9ec92ca0b44a 100644 (file)
@@ -40,6 +40,7 @@ L2_MODEL = l2network_models
 def initialize(base=None):
     global L2_MODEL
     options = {"sql_connection": "%s" % CONF.DATABASE.sql_connection}
+    options.update({"sql_max_retries": CONF.DATABASE.sql_max_retries})
     options.update({"reconnect_interval": CONF.DATABASE.reconnect_interval})
     if base:
         options.update({"base": base})
index f73a53852c3aed73b634e8b6f345d2f8a411d956..0e0f61a330f2b74b2edeaf8c08744ecd92b5a360 100644 (file)
@@ -19,6 +19,7 @@ from quantum.openstack.common import cfg
 
 database_opts = [
     cfg.StrOpt('sql_connection', default='sqlite://'),
+    cfg.IntOpt('sql_max_retries', default=-1),
     cfg.IntOpt('reconnect_interval', default=2),
 ]
 
index 31ce5c4fb8366dee4d77a3bb1d75602c7ff8b726..13d0a45d9b467cfcba2bed197c0f0d5b643f3604 100644 (file)
@@ -103,6 +103,8 @@ class OVSQuantumPlugin(QuantumPluginBase):
     def __init__(self, configfile=None):
         conf = config.parse(CONF_FILE)
         options = {"sql_connection": conf.DATABASE.sql_connection}
+        sql_max_retries = conf.DATABASE.sql_max_retries
+        options.update({"sql_max_retries": sql_max_retries})
         reconnect_interval = conf.DATABASE.reconnect_interval
         options.update({"reconnect_interval": reconnect_interval})
         db.configure_db(options)
@@ -236,6 +238,8 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2):
         conf = config.parse(CONF_FILE)
         options = {"sql_connection": conf.DATABASE.sql_connection}
         options.update({'base': models_v2.model_base.BASEV2})
+        sql_max_retries = conf.DATABASE.sql_max_retries
+        options.update({"sql_max_retries": sql_max_retries})
         reconnect_interval = conf.DATABASE.reconnect_interval
         options.update({"reconnect_interval": reconnect_interval})
         db.configure_db(options)
index a18097924eba9d48bf5e19c2541ac03ae6d12c99..22672ec03658dc0ef721a996f3aac22a65fd05b8 100644 (file)
@@ -19,6 +19,7 @@ from quantum.openstack.common import cfg
 
 database_opts = [
     cfg.StrOpt('sql_connection', default='sqlite://'),
+    cfg.IntOpt('sql_max_retries', default=-1),
     cfg.IntOpt('reconnect_interval', default=2),
 ]
 
index 16ec5b23557cc89ffdde8e1b004ab0471aece4f0..9d6a553cb7a838c81dbbb288235afeacf0ce6734 100644 (file)
@@ -66,6 +66,8 @@ class OVSQuantumPluginBase(QuantumPluginBase):
         LOG.debug("Using configuration file: %s" % configfile)
         conf = config.parse(configfile)
         options = {"sql_connection": conf.DATABASE.sql_connection}
+        sql_max_retries = conf.DATABASE.sql_max_retries
+        options.update({"sql_max_retries": sql_max_retries})
         reconnect_interval = conf.DATABASE.reconnect_interval
         options.update({"reconnect_interval": reconnect_interval})
         db.configure_db(options)
index f3140402f0dd8d020f13d75f8171c3a41f08d241..d8278e47d25e9f7ed34e4f56b031966adcf83939 100644 (file)
@@ -25,6 +25,7 @@ class LinuxBridgeConfigTestCase(unittest.TestCase):
     def test_dummy(self):
         configs = """[DATABASE]
 sql_connection = testlink
+sql_max_retries = 200
 reconnect_interval=100
 [AGENT]
 root_helper = mysudo
@@ -39,6 +40,7 @@ polling_interval=50
 
             conf = config.parse(path)
             self.assertEqual('testlink', conf.DATABASE.sql_connection)
+            self.assertEqual(200, conf.DATABASE.sql_max_retries)
             self.assertEqual(100, conf.DATABASE.reconnect_interval)
             self.assertEqual(50, conf.AGENT.polling_interval)
             self.assertEqual('mysudo', conf.AGENT.root_helper)
@@ -59,6 +61,7 @@ polling_interval=50
 
             conf = config.parse(path)
             self.assertEqual('sqlite://', conf.DATABASE.sql_connection)
+            self.assertEqual(-1, conf.DATABASE.sql_max_retries)
             self.assertEqual(2, conf.DATABASE.reconnect_interval)
             self.assertEqual(2, conf.AGENT.polling_interval)
             self.assertEqual('sudo', conf.AGENT.root_helper)
index 624fa09038f70a23b32f0e4a61868806f8e3722b..44c02114103917204f77f29715fbedab85183867 100644 (file)
@@ -29,6 +29,7 @@ class OvsConfigTestCase(unittest.TestCase):
     def test_tunnel(self):
         configs = """[DATABASE]
 sql_connection = testlink
+sql_max_retries = 200
 reconnect_interval=100
 [OVS]
 enable_tunneling = True
@@ -51,6 +52,7 @@ polling_interval=50
             self.assertEqual('mybrint', conf.OVS.integration_bridge)
             self.assertEqual('mybrtun', conf.OVS.tunnel_bridge)
             self.assertEqual('testlink', conf.DATABASE.sql_connection)
+            self.assertEqual(200, conf.DATABASE.sql_max_retries)
             self.assertEqual(100, conf.DATABASE.reconnect_interval)
             self.assertEqual(50, conf.AGENT.polling_interval)
             self.assertEqual('mysudo', conf.AGENT.root_helper)
@@ -74,6 +76,7 @@ polling_interval=50
             self.assertEqual('br-int', conf.OVS.integration_bridge)
             self.assertEqual('br-tun', conf.OVS.tunnel_bridge)
             self.assertEqual('sqlite://', conf.DATABASE.sql_connection)
+            self.assertEqual(-1, conf.DATABASE.sql_max_retries)
             self.assertEqual(2, conf.DATABASE.reconnect_interval)
             self.assertEqual(2, conf.AGENT.polling_interval)
             self.assertEqual('sudo', conf.AGENT.root_helper)
index 1a375c1790beb9cff87ac84f3a968df305b29d33..132f60e464251494b42614ef1aced8726e7419eb 100644 (file)
@@ -25,6 +25,7 @@ class RyuConfigTestCase(unittest.TestCase):
     def test_config(self):
         configs = """[DATABASE]
 sql_connection = testlink
+sql_max_retries = 200
 reconnect_interval=100
 [OVS]
 enable_tunneling = True
@@ -44,6 +45,7 @@ polling_interval=50
             conf = config.parse(path)
             self.assertEqual('mybrint', conf.OVS.integration_bridge)
             self.assertEqual('testlink', conf.DATABASE.sql_connection)
+            self.assertEqual(200, conf.DATABASE.sql_max_retries)
             self.assertEqual(100, conf.DATABASE.reconnect_interval)
             self.assertEqual(50, conf.AGENT.polling_interval)
             self.assertEqual('mysudo', conf.AGENT.root_helper)
@@ -65,6 +67,7 @@ polling_interval=50
             conf = config.parse(path)
             self.assertEqual('br-int', conf.OVS.integration_bridge)
             self.assertEqual('sqlite://', conf.DATABASE.sql_connection)
+            self.assertEqual(-1, conf.DATABASE.sql_max_retries)
             self.assertEqual(2, conf.DATABASE.reconnect_interval)
             self.assertEqual(2, conf.AGENT.polling_interval)
             self.assertEqual('sudo', conf.AGENT.root_helper)