Fix neutron_pg_drop-related startup issues

There is a python-ovs bug that allows transactions to be executed
before it has started monitoring the db for changes. This breaks
ovsdbapp's AddCommand behavior, which looks up a row in memory
post-commit to return it to the caller, because we process the
reply from ovsdb-server that has the UUID in it, but when we try to
look it up in memory, it isn't there since that is handled via the
monitor notifications.

Since we don't care about the return value, we can just ignore the
KeyError. In addition, the request to Idl.cond_change() to monitor
only the neutron_pg_drop table was failing for a similar reason--
it is called before the initial monitor request is sent, so
directly setting table.condition will allow the condition to be
added to the initial monitor request.

Conflicts:
  neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py

Closes-Bug: #1938766
Change-Id: I78af15970a86923fb810e903d38634b6e60a8fe4
(cherry picked from commit 76ee64f4a8)
This commit is contained in:
Terry Wilson 2021-09-01 14:19:19 +00:00
parent 6a761dc42d
commit 1327a54337
2 changed files with 14 additions and 3 deletions

View File

@ -240,6 +240,15 @@ class OVNMechanismDriver(api.MechanismDriver):
impl_idl_ovn.OvsdbNbOvnIdl, idl) as pre_ovn_nb_api:
try:
create_default_drop_port_group(pre_ovn_nb_api)
except KeyError:
# Due to a bug in python-ovs, we can send transactions before
# the initial OVSDB is populated in memory. This can break
# the AddCommand post_commit method which tries to return a
# row looked up by the newly commited row's uuid. Since we
# don't care about the return value from the PgAddCommand, we
# can just catch the KeyError and continue. This can be
# removed when the python-ovs bug is resolved.
pass
except RuntimeError as re:
if pre_ovn_nb_api.get_port_group(
ovn_const.OVN_DROP_PORT_GROUP_NAME):

View File

@ -572,9 +572,11 @@ class OvnInitPGNbIdl(OvnIdl):
def __init__(self, driver, remote, schema):
super(OvnInitPGNbIdl, self).__init__(driver, remote, schema)
self.cond_change(
'Port_Group',
[['name', '==', ovn_const.OVN_DROP_PORT_GROUP_NAME]])
# self.cond_change() doesn't work here because we are setting the
# condition *before an initial monitor request is made* so there is
# no previous session whose condition we wish to change
self.tables['Port_Group'].condition = [
['name', '==', ovn_const.OVN_DROP_PORT_GROUP_NAME]]
self.neutron_pg_drop_event = NeutronPgDropPortGroupCreated()
self.notify_handler.watch_event(self.neutron_pg_drop_event)