Call target plugin out of DB transaction in the Metaplugin
Previously, there are cases that a target plugin is called within a DB transaction in the metaplugin. This possibly causes "DB lock timeout" error since a target plugin may take a long time (ex. communicate to a controller). Change-Id: Ie2971bfae1fecc97086b58cd943c321feb0aba04 Closes-Bug: #1267291
This commit is contained in:
parent
00e19fb99b
commit
e4389eb46f
@ -192,7 +192,6 @@ class MetaPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
|
|||||||
if str(flavor) not in self.plugins:
|
if str(flavor) not in self.plugins:
|
||||||
flavor = self.default_flavor
|
flavor = self.default_flavor
|
||||||
plugin = self._get_plugin(flavor)
|
plugin = self._get_plugin(flavor)
|
||||||
with context.session.begin(subtransactions=True):
|
|
||||||
net = plugin.create_network(context, network)
|
net = plugin.create_network(context, network)
|
||||||
LOG.debug(_("Created network: %(net_id)s with flavor "
|
LOG.debug(_("Created network: %(net_id)s with flavor "
|
||||||
"%(flavor)s"), {'net_id': net['id'], 'flavor': flavor})
|
"%(flavor)s"), {'net_id': net['id'], 'flavor': flavor})
|
||||||
@ -336,13 +335,17 @@ class MetaPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
|
|||||||
if str(flavor) not in self.l3_plugins:
|
if str(flavor) not in self.l3_plugins:
|
||||||
flavor = self.default_l3_flavor
|
flavor = self.default_l3_flavor
|
||||||
plugin = self._get_l3_plugin(flavor)
|
plugin = self._get_l3_plugin(flavor)
|
||||||
with context.session.begin(subtransactions=True):
|
|
||||||
r_in_db = plugin.create_router(context, router)
|
r_in_db = plugin.create_router(context, router)
|
||||||
LOG.debug(_("Created router: %(router_id)s with flavor "
|
LOG.debug(_("Created router: %(router_id)s with flavor "
|
||||||
"%(flavor)s"),
|
"%(flavor)s"),
|
||||||
{'router_id': r_in_db['id'], 'flavor': flavor})
|
{'router_id': r_in_db['id'], 'flavor': flavor})
|
||||||
|
try:
|
||||||
meta_db_v2.add_router_flavor_binding(context.session,
|
meta_db_v2.add_router_flavor_binding(context.session,
|
||||||
flavor, str(r_in_db['id']))
|
flavor, str(r_in_db['id']))
|
||||||
|
except Exception:
|
||||||
|
LOG.exception(_('Failed to add flavor bindings'))
|
||||||
|
plugin.delete_router(context, r_in_db['id'])
|
||||||
|
raise FaildToAddFlavorBinding()
|
||||||
|
|
||||||
LOG.debug(_("Created router: %s"), r_in_db['id'])
|
LOG.debug(_("Created router: %s"), r_in_db['id'])
|
||||||
self._extend_router_dict(context, r_in_db)
|
self._extend_router_dict(context, r_in_db)
|
||||||
|
@ -27,6 +27,8 @@ from neutron.db import db_base_plugin_v2
|
|||||||
from neutron.db import models_v2
|
from neutron.db import models_v2
|
||||||
from neutron.extensions.flavor import (FLAVOR_NETWORK, FLAVOR_ROUTER)
|
from neutron.extensions.flavor import (FLAVOR_NETWORK, FLAVOR_ROUTER)
|
||||||
from neutron.openstack.common import uuidutils
|
from neutron.openstack.common import uuidutils
|
||||||
|
from neutron.plugins.metaplugin.meta_neutron_plugin import (
|
||||||
|
FaildToAddFlavorBinding)
|
||||||
from neutron.plugins.metaplugin.meta_neutron_plugin import FlavorNotFound
|
from neutron.plugins.metaplugin.meta_neutron_plugin import FlavorNotFound
|
||||||
from neutron.plugins.metaplugin.meta_neutron_plugin import MetaPluginV2
|
from neutron.plugins.metaplugin.meta_neutron_plugin import MetaPluginV2
|
||||||
from neutron.tests import base
|
from neutron.tests import base
|
||||||
@ -331,6 +333,30 @@ class MetaNeutronPluginV2Test(base.BaseTestCase):
|
|||||||
|
|
||||||
self.fail("No Error is not raised")
|
self.fail("No Error is not raised")
|
||||||
|
|
||||||
|
def test_create_network_flavor_fail(self):
|
||||||
|
with mock.patch('neutron.plugins.metaplugin.meta_db_v2.'
|
||||||
|
'add_network_flavor_binding',
|
||||||
|
side_effect=Exception):
|
||||||
|
network = self._fake_network('fake1')
|
||||||
|
self.assertRaises(FaildToAddFlavorBinding,
|
||||||
|
self.plugin.create_network,
|
||||||
|
self.context,
|
||||||
|
network)
|
||||||
|
count = self.plugin.get_networks_count(self.context)
|
||||||
|
self.assertEqual(count, 0)
|
||||||
|
|
||||||
|
def test_create_router_flavor_fail(self):
|
||||||
|
with mock.patch('neutron.plugins.metaplugin.meta_db_v2.'
|
||||||
|
'add_router_flavor_binding',
|
||||||
|
side_effect=Exception):
|
||||||
|
router = self._fake_router('fake1')
|
||||||
|
self.assertRaises(FaildToAddFlavorBinding,
|
||||||
|
self.plugin.create_router,
|
||||||
|
self.context,
|
||||||
|
router)
|
||||||
|
count = self.plugin.get_routers_count(self.context)
|
||||||
|
self.assertEqual(count, 0)
|
||||||
|
|
||||||
|
|
||||||
class MetaNeutronPluginV2TestWithoutL3(MetaNeutronPluginV2Test):
|
class MetaNeutronPluginV2TestWithoutL3(MetaNeutronPluginV2Test):
|
||||||
"""Tests without l3_plugin_list configration."""
|
"""Tests without l3_plugin_list configration."""
|
||||||
@ -343,3 +369,6 @@ class MetaNeutronPluginV2TestWithoutL3(MetaNeutronPluginV2Test):
|
|||||||
|
|
||||||
def test_create_delete_router(self):
|
def test_create_delete_router(self):
|
||||||
self.skipTest("Test case without router")
|
self.skipTest("Test case without router")
|
||||||
|
|
||||||
|
def test_create_router_flavor_fail(self):
|
||||||
|
self.skipTest("Test case without router")
|
||||||
|
Loading…
Reference in New Issue
Block a user