[ovs-dev] [PATCH] [python] Avoid sending transactions when the DB is not synced up

Terry Wilson twilson at redhat.com
Wed Sep 1 17:39:10 UTC 2021


This should backport cleanly down to 2.15. Before that, nothing had
added the IDL_S_MONITORING state to python-ovs ( added by
https://github.com/openvswitch/ovs/commit/daf627f459ffbc7171d42a2c01f80754bfd54edc
). It would be nice to take this back to 2.13, but if we need to
maintain the fix downstream-only, we can do that. Adding just the
state is a pretty straightforward couple of lines.

For OpenStack/Neutron, ovsdbapp had worked around this problem by
waiting for the seqno to change with the first reply, which until
https://github.com/openvswitch/ovs/commit/c39751e44539a014e642bcd930cb9e3a33af1805
was the update notification from the monitor request. Now that there
are requests for _Server, etc., that no longer works.

On Wed, Sep 1, 2021 at 11:15 AM Terry Wilson <twilson at redhat.com> wrote:
>
> This ports the C IDL change f50714b to the Python IDL:
>
> Until now the code here would happily try to send transactions to the
> database server even if the database connection was not in the correct
> state.  In some cases this could lead to strange behavior, such as sending
> a database transaction for a database that the IDL had just learned did not
> exist on the server.
>
> Signed-off-by: Terry Wilson <twilson at redhat.com>
> ---
>  python/ovs/db/idl.py | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
> index ecae5e143..0be0064de 100644
> --- a/python/ovs/db/idl.py
> +++ b/python/ovs/db/idl.py
> @@ -1500,6 +1500,12 @@ class Transaction(object):
>          the IDL's copy of the database.  If the transaction commits
>          successfully, then the database server will send an update and, thus,
>          the IDL will be updated with the committed changes."""
> +
> +        if self.idl.state != Idl.IDL_S_MONITORING:
> +            self._status = Transaction.TRY_AGAIN
> +            self.__disassemble()
> +            return self._status
> +
>          # The status can only change if we're the active transaction.
>          # (Otherwise, our status will change only in Idl.run().)
>          if self != self.idl.txn:
> --
> 2.27.0
>



More information about the dev mailing list