]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix deadlock of Metaplugin
authorNachi Ueno <nachi@nttmcl.com>
Wed, 19 Sep 2012 03:26:07 +0000 (03:26 +0000)
committerNachi Ueno <nachi@nttmcl.com>
Wed, 19 Sep 2012 03:26:07 +0000 (03:26 +0000)
Fixes bug 1049981
Fix deadlock on network creation
Fix attribute filtering function

Change-Id: I6b75ea9c22b7844f84de16416d9610ad8c628800

quantum/plugins/metaplugin/meta_db_v2.py
quantum/plugins/metaplugin/meta_quantum_plugin.py

index 836f6692da8bdbc43953bfb423b953033def78f9..fd32b43c68e164a397ff7f15a4ced2e5499799b7 100644 (file)
@@ -21,8 +21,7 @@ import quantum.db.api as db
 from quantum.plugins.metaplugin import meta_models_v2
 
 
-def get_flavor_by_network(net_id):
-    session = db.get_session()
+def get_flavor_by_network(session, net_id):
     try:
         binding = (session.query(meta_models_v2.NetworkFlavor).
                    filter_by(network_id=net_id).
@@ -32,16 +31,13 @@ def get_flavor_by_network(net_id):
     return binding.flavor
 
 
-def add_network_flavor_binding(flavor, net_id):
-    session = db.get_session()
+def add_network_flavor_binding(session, flavor, net_id):
     binding = meta_models_v2.NetworkFlavor(flavor=flavor, network_id=net_id)
     session.add(binding)
-    session.flush()
     return binding
 
 
-def get_flavor_by_router(router_id):
-    session = db.get_session()
+def get_flavor_by_router(session, router_id):
     try:
         binding = (session.query(meta_models_v2.RouterFlavor).
                    filter_by(router_id=router_id).
@@ -51,9 +47,7 @@ def get_flavor_by_router(router_id):
     return binding.flavor
 
 
-def add_router_flavor_binding(flavor, router_id):
-    session = db.get_session()
+def add_router_flavor_binding(session, flavor, router_id):
     binding = meta_models_v2.RouterFlavor(flavor=flavor, router_id=router_id)
     session.add(binding)
-    session.flush()
     return binding
index 6dc22ebdcbeca47754ea747d68ab8488b2e6059c..0de64a088e70917f926edfaa50ae564b8b76486d 100644 (file)
@@ -149,7 +149,7 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
         raise AttributeError
 
     def _extend_network_dict(self, context, network):
-        flavor = self._get_flavor_by_network_id(network['id'])
+        flavor = self._get_flavor_by_network_id(context, network['id'])
         network[FLAVOR_NETWORK] = flavor
 
     def _is_l3_plugin(self, plugin):
@@ -169,7 +169,8 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
             LOG.debug("Created network: %s with flavor %s " % (net['id'],
                                                                flavor))
             try:
-                meta_db_v2.add_network_flavor_binding(flavor, str(net['id']))
+                meta_db_v2.add_network_flavor_binding(context.session,
+                                                      flavor, str(net['id']))
             except:
                 LOG.exception('failed to add flavor bindings')
                 plugin.delete_network(context, net['id'])
@@ -180,7 +181,7 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
         return net
 
     def update_network(self, context, id, network):
-        flavor = meta_db_v2.get_flavor_by_network(id)
+        flavor = meta_db_v2.get_flavor_by_network(context.session, id)
         plugin = self._get_plugin(flavor)
         with context.session.begin(subtransactions=True):
             net = plugin.update_network(context, id, network)
@@ -190,12 +191,12 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
         return net
 
     def delete_network(self, context, id):
-        flavor = meta_db_v2.get_flavor_by_network(id)
+        flavor = meta_db_v2.get_flavor_by_network(context.session, id)
         plugin = self._get_plugin(flavor)
         return plugin.delete_network(context, id)
 
     def get_network(self, context, id, fields=None):
-        flavor = meta_db_v2.get_flavor_by_network(id)
+        flavor = meta_db_v2.get_flavor_by_network(context.session, id)
         plugin = self._get_plugin(flavor)
         net = plugin.get_network(context, id, fields)
         net['id'] = id
@@ -231,31 +232,33 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                 for net in nets]
         return nets
 
-    def _get_flavor_by_network_id(self, network_id):
-        return meta_db_v2.get_flavor_by_network(network_id)
+    def _get_flavor_by_network_id(self, context, network_id):
+        return meta_db_v2.get_flavor_by_network(context.session, network_id)
 
-    def _get_flavor_by_router_id(self, router_id):
-        return meta_db_v2.get_flavor_by_router(router_id)
+    def _get_flavor_by_router_id(self, context, router_id):
+        return meta_db_v2.get_flavor_by_router(context.session, router_id)
 
-    def _get_plugin_by_network_id(self, network_id):
-        flavor = self._get_flavor_by_network_id(network_id)
+    def _get_plugin_by_network_id(self, context, network_id):
+        flavor = self._get_flavor_by_network_id(context, network_id)
         return self._get_plugin(flavor)
 
     def create_port(self, context, port):
         p = port['port']
         if not 'network_id' in p:
             raise exc.NotFound
-        plugin = self._get_plugin_by_network_id(p['network_id'])
+        plugin = self._get_plugin_by_network_id(context, p['network_id'])
         return plugin.create_port(context, port)
 
     def update_port(self, context, id, port):
         port_in_db = self.get_port(context, id)
-        plugin = self._get_plugin_by_network_id(port_in_db['network_id'])
+        plugin = self._get_plugin_by_network_id(context,
+                                                port_in_db['network_id'])
         return plugin.update_port(context, id, port)
 
     def delete_port(self, context, id, l3_port_check=True):
         port_in_db = self.get_port(context, id)
-        plugin = self._get_plugin_by_network_id(port_in_db['network_id'])
+        plugin = self._get_plugin_by_network_id(context,
+                                                port_in_db['network_id'])
         if l3_port_check:
             self.prevent_l3_port_deletion(context, id)
             self.disassociate_floatingips(context, id)
@@ -265,21 +268,24 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
         s = subnet['subnet']
         if not 'network_id' in s:
             raise exc.NotFound
-        plugin = self._get_plugin_by_network_id(s['network_id'])
+        plugin = self._get_plugin_by_network_id(context,
+                                                s['network_id'])
         return plugin.create_subnet(context, subnet)
 
     def update_subnet(self, context, id, subnet):
         s = self.get_subnet(context, id)
-        plugin = self._get_plugin_by_network_id(s['network_id'])
+        plugin = self._get_plugin_by_network_id(context,
+                                                s['network_id'])
         return plugin.update_subnet(context, id, subnet)
 
     def delete_subnet(self, context, id):
         s = self.get_subnet(context, id)
-        plugin = self._get_plugin_by_network_id(s['network_id'])
+        plugin = self._get_plugin_by_network_id(context,
+                                                s['network_id'])
         return plugin.delete_subnet(context, id)
 
     def _extend_router_dict(self, context, router):
-        flavor = self._get_flavor_by_router_id(router['id'])
+        flavor = self._get_flavor_by_router_id(context, router['id'])
         router[FLAVOR_ROUTER] = flavor
 
     def create_router(self, context, router):
@@ -288,32 +294,29 @@ class MetaPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
         if not str(flavor) in self.l3_plugins:
             flavor = self.default_l3_flavor
         plugin = self._get_l3_plugin(flavor)
-        r_in_db = plugin.create_router(context, router)
-        LOG.debug("Created router: %s with flavor %s " % (r_in_db['id'],
-                                                          flavor))
-        try:
-            meta_db_v2.add_router_flavor_binding(flavor, str(r_in_db['id']))
-        except:
-            LOG.exception('failed to add flavor bindings')
-            plugin.delete_router(context, r_in_db['id'])
-            raise FaildToAddFlavorBinding()
+        with context.session.begin(subtransactions=True):
+            r_in_db = plugin.create_router(context, router)
+            LOG.debug("Created router: %s with flavor %s " % (r_in_db['id'],
+                                                              flavor))
+            meta_db_v2.add_router_flavor_binding(context.session,
+                                                 flavor, str(r_in_db['id']))
 
         LOG.debug("Created router: %s" % r_in_db['id'])
         self._extend_router_dict(context, r_in_db)
         return r_in_db
 
     def update_router(self, context, id, router):
-        flavor = meta_db_v2.get_flavor_by_router(id)
+        flavor = meta_db_v2.get_flavor_by_router(context.session, id)
         plugin = self._get_l3_plugin(flavor)
         return plugin.update_router(context, id, router)
 
     def delete_router(self, context, id):
-        flavor = meta_db_v2.get_flavor_by_router(id)
+        flavor = meta_db_v2.get_flavor_by_router(context.session, id)
         plugin = self._get_l3_plugin(flavor)
         return plugin.delete_router(context, id)
 
     def get_router(self, context, id, fields=None):
-        flavor = meta_db_v2.get_flavor_by_router(id)
+        flavor = meta_db_v2.get_flavor_by_router(context.session, id)
         plugin = self._get_l3_plugin(flavor)
         router = plugin.get_router(context, id, fields)
         if not fields or FLAVOR_ROUTER in fields: