Merge "Fix race condition retrieving logical router rows"

This commit is contained in:
Zuul 2021-08-27 15:50:38 +00:00 committed by Gerrit Code Review
commit f257fc1a24
4 changed files with 44 additions and 15 deletions

View File

@ -302,8 +302,8 @@ class OvnProviderHelper():
[])}
def _find_lb_in_table(self, lb, table):
return [item for item in self.ovn_nbdb_api.tables[table].rows.values()
if lb in item.load_balancer]
return self.ovn_nbdb_api.find_lb_in_table(
lb, table).execute(check_error=True)
def request_handler(self):
while True:
@ -636,7 +636,8 @@ class OvnProviderHelper():
if not lrp_name:
return
for lr in self.ovn_nbdb_api.tables['Logical_Router'].rows.values():
lrs = self.ovn_nbdb_api.get_lrs().execute(check_error=True)
for lr in lrs:
for lrp in lr.ports:
if lrp.name == lrp_name:
return lr
@ -991,12 +992,12 @@ class OvnProviderHelper():
if_exists=True))
lr_ref = ovn_lb.external_ids.get(ovn_const.LB_EXT_IDS_LR_REF_KEY, {})
if lr_ref:
for lr in self.ovn_nbdb_api.tables[
'Logical_Router'].rows.values():
if lr.name == lr_ref:
commands.append(self.ovn_nbdb_api.lr_lb_del(
lr.uuid, ovn_lb.uuid))
break
try:
lr = self.ovn_nbdb_api.lookup('Logical_Router', lr_ref)
commands.append(self.ovn_nbdb_api.lr_lb_del(
lr.uuid, ovn_lb.uuid))
except idlutils.RowNotFound:
pass
# Delete LB from all Routers the LB is indirectly associated
for lr in self._find_lb_in_table(ovn_lb, 'Logical_Router'):
commands.append(

View File

@ -16,8 +16,10 @@ import contextlib
from neutron_lib import exceptions as n_exc
from oslo_log import log
from ovsdbapp.backend import ovs_idl
from ovsdbapp.backend.ovs_idl import command
from ovsdbapp.backend.ovs_idl import connection
from ovsdbapp.backend.ovs_idl import idlutils
from ovsdbapp.backend.ovs_idl import rowview
from ovsdbapp.backend.ovs_idl import transaction as idl_trans
from ovsdbapp.schema.ovn_northbound import impl_idl as nb_impl_idl
from ovsdbapp.schema.ovn_southbound import impl_idl as sb_impl_idl
@ -115,6 +117,26 @@ class OvsdbConnectionUnavailable(n_exc.ServiceUnavailable):
"'ovn_sb_connection' configuration options are correct.")
class FindLbInTableCommand(command.ReadOnlyCommand):
def __init__(self, api, lb, table):
super().__init__(api)
self.lb = lb
self.table = table
def run_idl(self, txn):
self.result = [
rowview.RowView(item) for item in
self.api.tables[self.table].rows.values()
if self.lb in item.load_balancer]
class GetLrsCommand(command.ReadOnlyCommand):
def run_idl(self, txn):
self.result = [
rowview.RowView(item) for item in
self.api.tables['Logical_Router'].rows.values()]
class OvsdbNbOvnIdl(nb_impl_idl.OvnNbApiIdlImpl, Backend):
def __init__(self, connection):
super().__init__(connection)
@ -144,6 +166,12 @@ class OvsdbNbOvnIdl(nb_impl_idl.OvnNbApiIdlImpl, Backend):
except ovn_exc.RevisionConflict as e:
LOG.info('Transaction aborted. Reason: %s', e)
def find_lb_in_table(self, lb, table):
return FindLbInTableCommand(self, lb, table)
def get_lrs(self):
return GetLrsCommand(self)
class OvsdbSbOvnIdl(sb_impl_idl.OvnSbApiIdlImpl, Backend):
def __init__(self, connection):

View File

@ -66,6 +66,7 @@ class OvnIdl(BaseOvnIdl):
# but not granted by the ovsdb-server.
if self.is_lock_contended:
return
row = idlutils.frozen_row(row)
self.notify_handler.notify(event, row, updates)
@abc.abstractmethod

View File

@ -558,8 +558,7 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase):
net_cli.return_value.delete_port.return_value = None
(self.helper.ovn_nbdb_api.ls_get.return_value.execute.
return_value) = self.network
(self.helper.ovn_nbdb_api.tables['Logical_Router'].rows.
values.return_value) = [self.router]
self.helper.ovn_nbdb_api.lookup.return_value = self.router
self.helper.lb_delete(self.ovn_lb)
self.helper.ovn_nbdb_api.ls_lb_del.assert_called_once_with(
self.network.uuid, self.ovn_lb.uuid)
@ -1818,8 +1817,8 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase):
ls = fakes.FakeOvsdbRow.create_one_ovsdb_row(
attrs={'ports': [lsp]})
(self.helper.ovn_nbdb_api.tables['Logical_Router'].rows.
values.return_value) = [lr]
(self.helper.ovn_nbdb_api.get_lrs.return_value.
execute.return_value) = [lr]
returned_lr = self.helper._find_lr_of_ls(ls)
self.assertEqual(lr, returned_lr)
@ -1841,8 +1840,8 @@ class TestOvnProviderHelper(ovn_base.TestOvnOctaviaBase):
ls = fakes.FakeOvsdbRow.create_one_ovsdb_row(
attrs={'ports': [lsp]})
(self.helper.ovn_nbdb_api.tables['Logical_Router'].rows.
values.return_value) = [lr]
(self.helper.ovn_nbdb_api.get_lrs.return_value.
execute.return_value) = [lr]
returned_lr = self.helper._find_lr_of_ls(ls)
self.assertEqual(lr, returned_lr)