diff --git a/neutron/services/revisions/revision_plugin.py b/neutron/services/revisions/revision_plugin.py index bf94fb5d6a4..93c415fe2fd 100644 --- a/neutron/services/revisions/revision_plugin.py +++ b/neutron/services/revisions/revision_plugin.py @@ -259,7 +259,12 @@ class RevisionPlugin(service_base.ServicePluginBase): to match. """ context = session.info.get('using_context') - criteria = context.get_transaction_constraint() if context else None + if context: + # NOTE(ralonsoh): use "pop_transaction_constraint" once implemented + criteria = context.get_transaction_constraint() + context.clear_transaction_constraint() + else: + criteria = None if not criteria: return None, None match = criteria.if_revision_match diff --git a/neutron/tests/unit/services/revisions/test_revision_plugin.py b/neutron/tests/unit/services/revisions/test_revision_plugin.py index 48ed29e91c8..fe035b4968b 100644 --- a/neutron/tests/unit/services/revisions/test_revision_plugin.py +++ b/neutron/tests/unit/services/revisions/test_revision_plugin.py @@ -155,8 +155,20 @@ class TestRevisionPlugin(test_plugin.Ml2PluginV2TestCase): raise db_exc.DBDeadlock() db_api.sqla_listen(se.Session, 'before_commit', concurrent_increment) + + # Despite the revision number is bumped twice during the session + # transaction, the revision number is tested only once the first + # time the revision number service is executed for this session and + # object. self._update('ports', port['port']['id'], new, headers={'If-Match': 'revision_number=%s' % rev}, + expected_code=exc.HTTPOk.code) + self._update('ports', port['port']['id'], new, + headers={'If-Match': 'revision_number=%s' % + str(int(rev) + 2)}, + expected_code=exc.HTTPOk.code) + self._update('ports', port['port']['id'], new, + headers={'If-Match': 'revision_number=1'}, expected_code=exc.HTTPPreconditionFailed.code) def test_port_ip_update_revises(self):