From a13a4cb2da03e2cdce04b0e7b4bc30e44ebdbd02 Mon Sep 17 00:00:00 2001 From: Terry Wilson Date: Tue, 22 Mar 2022 04:12:08 +0000 Subject: [PATCH] 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 --- lower-constraints.txt | 2 +- neutron/agent/ovn/metadata/ovsdb.py | 2 +- .../ovn/mech_driver/ovsdb/ovsdb_monitor.py | 17 ++++++++++++----- requirements.txt | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lower-constraints.txt b/lower-constraints.txt index cf60cc2db7e..6586d5a9dc9 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -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 diff --git a/neutron/agent/ovn/metadata/ovsdb.py b/neutron/agent/ovn/metadata/ovsdb.py index 18d9812f921..7817bdaf85c 100644 --- a/neutron/agent/ovn/metadata/ovsdb.py +++ b/neutron/agent/ovn/metadata/ovsdb.py @@ -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) diff --git a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py index 02ba4e3810c..f9939d91d34 100644 --- a/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py +++ b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py @@ -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) diff --git a/requirements.txt b/requirements.txt index 51c6ad2e02b..cdb6c3c548d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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)