On 9/20/21 20:10, Terry Wilson wrote: > The problem is that has_ever_connected() doesn't imply that we have > downloaded the db into memory since the _Server stuff was added.
Hmm. That does sound like a bug to me. has_ever_connected() should reflect only changes in the actual database, not the '_Server' one. This patch itself seems OK. But the root cause of neutron issues seems to be that has_ever_connected() is broken. > > On Mon, Sep 20, 2021 at 1:05 PM Ilya Maximets <i.maxim...@ovn.org> wrote: >> >> On 9/20/21 19:58, Terry Wilson wrote: >>> On Mon, Sep 20, 2021 at 12:29 PM Ilya Maximets <i.maxim...@ovn.org> wrote: >>>> >>>> On 9/20/21 18:15, Terry Wilson wrote: >>>>> On Thu, Sep 2, 2021 at 10:53 AM Dumitru Ceara <dce...@redhat.com> wrote: >>>>>> >>>>>> On 9/2/21 5:34 PM, Terry Wilson 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 <twil...@redhat.com> >>>>>>> --- >>>>>>> python/ovs/db/idl.py | 5 +++++ >>>>>>> 1 file changed, 5 insertions(+) >>>>>>> >>>>>>> diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py >>>>>>> index ecae5e143..87ee06cde 100644 >>>>>>> --- a/python/ovs/db/idl.py >>>>>>> +++ b/python/ovs/db/idl.py >>>>>>> @@ -1505,6 +1505,11 @@ class Transaction(object): >>>>>>> if self != self.idl.txn: >>>>>>> return self._status >>>>>>> >>>>>> >>>>>> Sorry, I should've probably mentioned this in the previous review, but I >>>>>> missed it. >>>>>> >>>>>> Nit: the comment from f50714bf9a72 ("ovsdb-idl: Avoid sending >>>>>> transactions when the DB is not synced up.") would be nice to have here >>>>>> too: >>>>>> >>>>>> # If we're still connecting or re-connecting, don't bother sending a >>>>>> # transaction. >>>>>> >>>>>> I guess this can be fixed up at apply time so: >>>>>> >>>>>> Acked-by: Dumitru Ceara <dce...@redhat.com> >>>>> >>>>> Just checking to see if we can get this merged? I'm happy to re-spin >>>>> with the comment, but discussion here and IRC made it sound like it >>>>> wasn't necessary. >>>> >>>> Hi, Terry. I wanted to apply this patch last week, but I wanted to ask >>>> if we need to treat that as a bug fix and backport to stable branches >>>> or is it just a thing that is nice to have? It's hard to tell what kind >>>> of issues this missing check is cousing. >>>> >>>> Best regards, Ilya Maximets. >>> >>> It's a bugfix that needs backports. What can happen is that if neutron >>> starts up and makes a transaction quickly after connecting, it can >>> create objects before it has gotten the monitor requests set up. >> >> Shouldn't it check for idl.has_ever_connected() before sending transactions? >> has_ever_connected() should be true only after successful monitor request. >> >>> If >>> you successfully insert an object, then call get_insert_uuid() on it, >>> you get the UUID of the transaction but cannot actually access the row >>> in Idl.tables because you aren't getting monitor updates yet. >>> >>> I'm a little worried about a more general case with get_insert_uuid() >>> in that it returns the UUID from the insert txn response, which if it >>> arrives before the monitor update notification, would still throw a >>> KeyError if you tried to access idl.tables[...][uuid]. The way the IDL >>> works (at least the python version), is that after the first call to >>> commit() where we generate/send the transaction message, we clear all >>> of the column data from the Row and don't get it back until we get the >>> monitor update. So it puts us in the weird position of being able to >>> call get_insert_uuid() immediately after a successful commit(), but >>> not be sure that we can actually access the Row object by that UUID or >>> have the column info that we wrote. That is, unless we are guaranteed >>> to always get monitor updates before transaction insert >>> responses--which it seems that we at least *mostly* do, but I'm just >>> not sure if it is guaranteed or a happy accident. >>> >>> In any case, this was a case that was easy to solve and was already >>> solved in the C IDL long ago and needs backports. Thanks! >>> >>> Terry >>> >>>>> >>>>>>> + if self.idl.state != Idl.IDL_S_MONITORING: >>>>>>> + self._status = Transaction.TRY_AGAIN >>>>>>> + self.__disassemble() >>>>>>> + return self._status >>>>>>> + >>>>>>> # If we need a lock but don't have it, give up quickly. >>>>>>> if self.idl.lock_name and not self.idl.has_lock: >>>>>>> self._status = Transaction.NOT_LOCKED >>>>>>> >>>>>> >>>>> >>>>> _______________________________________________ >>>>> dev mailing list >>>>> d...@openvswitch.org >>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >>>>> >>>> >>> >> > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev