nec plugin: Avoid long transaction in delete_ports

db_plugin.delete_ports() can lead to long transaction
if plugin.deleete_port talks with external system.
This commit removes a transaction in delete_ports and
allows NEC plugin to use more granular db transactions
in delete_port. It greatly helps db race conditions and
timeouts in delete_port operations.

To avoid to impact other plugins/drivers by changing
db_plugin.delete_ports directly and to land this patch soon,
this commit overrides delete_ports() in NEC plugin.
Further disssion on transaction in delete_ports will be
discussed under bug 1282925.

Closes-Bug: #1282922
Related-Bug: #1282925

Change-Id: I2c00694ad34eb2058bf7a0ff1c920ceded327d43
This commit is contained in:
Akihiro Motoki
2014-02-21 17:42:46 +09:00
committed by Gerrit Code Review
parent ac5a75eae8
commit aada19391a
2 changed files with 35 additions and 1 deletions

View File

@@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import contextlib
import os
import fixtures
@@ -127,7 +128,27 @@ class TestNecV2HTTPResponse(test_plugin.TestV2HTTPResponse,
class TestNecPortsV2(test_plugin.TestPortsV2, NecPluginV2TestCase):
pass
def test_delete_ports(self):
with self.subnet() as subnet:
with contextlib.nested(
self.port(subnet=subnet, device_owner='test-owner',
no_delete=True),
self.port(subnet=subnet, device_owner='test-owner',
no_delete=True),
self.port(subnet=subnet, device_owner='other-owner'),
) as (p1, p2, p3):
network_id = subnet['subnet']['network_id']
filters = {'network_id': [network_id],
'device_owner': ['test-owner']}
self.plugin.delete_ports(self.context, filters)
self._show('ports', p1['port']['id'],
expected_code=webob.exc.HTTPNotFound.code)
self._show('ports', p2['port']['id'],
expected_code=webob.exc.HTTPNotFound.code)
self._show('ports', p3['port']['id'],
expected_code=webob.exc.HTTPOk.code)
class TestNecNetworksV2(test_plugin.TestNetworksV2, NecPluginV2TestCase):