Fix setting table monitoring conditions

After the monitor_cond_since/update3 support patch in ovs
(46d44cf3be0), directly setting table.condition is broken. This
isn't something that was every truly supported. Prior to that
patch, using Idl.cond_change() before a connection was made
did not work, but after that patch it does.

This patch uses the old behavior when the OVS library does not
have the ConditionState object, and uses cond_change() otherwise.

Related-Bug: #1965819
Change-Id: I0503037b803a3c99fb7988bc20394c111ac456db
This commit is contained in:
Terry Wilson 2022-03-22 04:12:08 +00:00
parent 1a111b5e04
commit a13a4cb2da
4 changed files with 15 additions and 8 deletions

View File

@ -79,7 +79,7 @@ oslo.versionedobjects==1.35.1
oslotest==3.2.0
osprofiler==2.3.0
ovs==2.10.0
ovsdbapp==1.15.0
ovsdbapp==1.16.0
packaging==20.4
Paste==2.0.2
PasteDeploy==1.5.0

View File

@ -50,7 +50,7 @@ class MetadataAgentOvnSbIdl(ovsdb_monitor.OvnIdl):
if chassis:
for table in set(tables).intersection({'Chassis',
'Chassis_Private'}):
self.tables[table].condition = [['name', '==', chassis]]
self.set_table_condition(table, [['name', '==', chassis]])
if events:
self.notify_handler.watch_events(events)

View File

@ -23,6 +23,7 @@ from neutron_lib.utils import helpers
from oslo_config import cfg
from oslo_log import log
from oslo_utils import timeutils
from ovs.db import idl as ovs_idl_mod
from ovs.stream import Stream
from ovsdbapp.backend.ovs_idl import connection
from ovsdbapp.backend.ovs_idl import event as row_event
@ -693,6 +694,15 @@ class Ml2OvnIdlBase(connection.OvsdbIdl):
super(Ml2OvnIdlBase, self).__init__(
remote, schema, probe_interval=probe_interval, **kwargs)
def set_table_condition(self, table_name, condition):
# Prior to ovs commit 46d44cf3be0, self.cond_change() doesn't work here
# but after that commit, setting table.condtion doesn't work.
if hasattr(ovs_idl_mod, 'ConditionState'):
self.cond_change(table_name, condition)
else:
# Can be removed after the minimum ovs version >= 2.17.0
self.tables[table_name].condition = condition
class BaseOvnIdl(Ml2OvnIdlBase):
def __init__(self, remote, schema, **kwargs):
@ -909,11 +919,8 @@ class OvnInitPGNbIdl(OvnIdl):
def __init__(self, driver, remote, schema):
super(OvnInitPGNbIdl, self).__init__(driver, remote, schema)
# 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.set_table_condition(
'Port_Group', [['name', '==', ovn_const.OVN_DROP_PORT_GROUP_NAME]])
self.neutron_pg_drop_event = NeutronPgDropPortGroupCreated(
timeout=ovn_conf.get_ovn_ovsdb_timeout())
self.notify_handler.watch_event(self.neutron_pg_drop_event)

View File

@ -46,7 +46,7 @@ osprofiler>=2.3.0 # Apache-2.0
os-ken>=2.2.0 # Apache-2.0
os-resource-classes>=1.1.0 # Apache-2.0
ovs>=2.10.0 # Apache-2.0
ovsdbapp>=1.15.0 # Apache-2.0
ovsdbapp>=1.16.0 # Apache-2.0
packaging>=20.4 # Apache-2.0
psutil>=5.3.0 # BSD
pyroute2>=0.6.6;sys_platform!='win32' # Apache-2.0 (+ dual licensed GPL2)