Don't ever give up trying to connect to OVN DBs

It doesn't really make since to give up connectimg to the OVN DBs
since we can't do anything without them. If ovsdb-server is slow
and takes more than timeout seconds, everything reconnecting after
partial downloads and starting over is not going to make things
better.

We can change the behavior in ovsdbapp, but doing it without
making non-backportable API changes isn't easily doable.
The plan would be, after merging this back through stable, to
modify ovsdbapp to allow setting different connection and txn
timeouts and being able to disable the timeout in wait_for_change
with a value of -1. Then in the main branch of neutron we can
use that going forward.

Closes-Bug: #1926653

Conflicts:
neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py

Change-Id: Ia9e23113fdeebf0b99085da200c3d61b71567d36
(cherry picked from commit 39ccc0d6d6)
This commit is contained in:
Terry Wilson 2021-04-21 16:35:22 +00:00 committed by Flavio Fernandes
parent 31d6707988
commit f7292de52e
2 changed files with 34 additions and 0 deletions

View File

@ -38,6 +38,19 @@ from neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb import ovsdb_monitor
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
# Override wait_for_change to not use a timeout so we always try to reconnect
def wait_for_change(idl_, timeout, seqno=None):
if seqno is None:
seqno = idl_.change_seqno
while idl_.change_seqno == seqno and not idl_.run():
poller = idlutils.poller.Poller()
idl_.wait(poller)
poller.block()
idlutils.wait_for_change = wait_for_change
class OvnNbTransaction(idl_trans.Transaction): class OvnNbTransaction(idl_trans.Transaction):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@ -14,6 +14,7 @@
import uuid import uuid
from ovsdbapp.backend.ovs_idl import connection
from ovsdbapp import event as ovsdb_event from ovsdbapp import event as ovsdb_event
from ovsdbapp.tests.functional import base from ovsdbapp.tests.functional import base
from ovsdbapp.tests import utils from ovsdbapp.tests import utils
@ -147,3 +148,23 @@ class TestSbApi(base.FunctionalTestCase,
self.assertEqual( self.assertEqual(
(chassis.name, str(binding.datapath.uuid)), (chassis.name, str(binding.datapath.uuid)),
self.api.get_logical_port_chassis_and_datapath(port.name)) self.api.get_logical_port_chassis_and_datapath(port.name))
class TestIgnoreConnectionTimeout(base.FunctionalTestCase,
n_base.BaseLoggingTestCase):
schemas = ['OVN_Southbound', 'OVN_Northbound']
def setUp(self):
super(TestIgnoreConnectionTimeout, self).setUp()
self.api = impl.OvsdbSbOvnIdl(self.connection['OVN_Southbound'])
self.nbapi = impl.OvsdbNbOvnIdl(self.connection['OVN_Northbound'])
self.handler = ovsdb_event.RowEventHandler()
self.api.idl.notify = self.handler.notify
@classmethod
def create_connection(cls, schema):
idl = connection.OvsdbIdl.from_server(cls.schema_map[schema], schema)
return connection.Connection(idl, 0)
def test_setUp_will_fail_if_this_is_broken(self):
pass