On 5/27/24 20:31, Roberto Bartzen Acosta wrote:
> Thanks Ilya!
> 
> Em seg., 27 de mai. de 2024 às 10:28, Ilya Maximets <i.maxim...@ovn.org 
> <mailto:i.maxim...@ovn.org>> escreveu:
> 
>     On 5/27/24 18:22, Roberto Bartzen Acosta via discuss wrote:
>     > Hello everyone!
>     >
>     > I found an issue during testing with the OVN-IC daemon. I noticed that 
> applications that interact with python-idl show an error when deleting 
> datapath_binding when the table index changes.
>     >
>     > We can see the error in the logs below:
>     >
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
> [-] Datapath_Binding(uuid=UUID('498e66a2-70bc-4587-a66f-0433baf82f60'), 
> tunnel_key=16711683, load_balancers=[], external_ids={}) not in list: 
> ValueError: 
> Datapath_Binding(uuid=UUID('498e66a2-70bc-4587-a66f-0433baf82f60'), 
> tunnel_key=16711683, load_balancers=[], external_ids={}) not in list
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
> Traceback (most recent call last):
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File 
> "/usr/lib/python3/dist-packages/ovsdbapp/backend/ovs_idl/connection.py", line 
> 110, in run
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     self.idl.run()
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/ovs/db/idl.py", line 465, in run
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     self.__parse_update(msg.params[2], OVSDB_UPDATE3)
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/ovs/db/idl.py", line 924, in 
> __parse_update
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     self.__do_parse_update(update, version, self.tables)
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/ovs/db/idl.py", line 964, in 
> __do_parse_update
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     changes = self.__process_update2(table, uuid, row_update)
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/ovs/db/idl.py", line 991, in 
> __process_update2
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     del table.rows[uuid]
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/ovs/db/custom_index.py", line 102, in 
> __delitem__
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     index.remove(val)
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/ovs/db/custom_index.py", line 66, in 
> remove
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     self.values.remove(self.index_entry_from_row(row))
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>   File "/usr/lib/python3/dist-packages/sortedcontainers/sortedlist.py", line 
> 2015, in remove
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
>     raise ValueError('{0!r} not in list'.format(value))
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection 
> ValueError: 
> Datapath_Binding(uuid=UUID('498e66a2-70bc-4587-a66f-0433baf82f60'), 
> tunnel_key=16711683, load_balancers=[], external_ids={}) not in list
>     > 2024-05-27 09:49:38.779 23596 ERROR ovsdbapp.backend.ovs_idl.connection
>     >
>     >
>     > The complete logs showing the creation, update of the tunnel_key and 
> deletion of the datapath_binding can be accessed at [1].
>     >
>     > Basically the problem occurs because of the tunnel_key update when we 
> create a transit-switch. If the table did not have this index the problem 
> would not be observed.
>     >
>     > This issue affects applications such as: neutron-server, 
> neutron-ovn-metadata-agent, and everyone that monitors the Datapath_Binding 
> table via python-idl.
>     >
>     > I've already talked to Ilya Maximets in the openvswitch IRC channel and 
> the issue seems to be in the row updating process: python/ovs/db/idl.py.
> 
> 
>     Thanks, Roberto!  I beleive the fix I shared on IRC is mostly correct 
> though
>     I didn't test it.  I need to refine it a little and add a unit test for 
> the
>     issue.  With that I hope to post it for review somewhere soon.
> 
> 
> 
> Just to update on the patch you proposed, the deletion of the entry fails 
> during the python-idl update execution. The content of the table row has 
> already been updated just above in the __apply_diff and/or __row_update 
> methods. If you request to delete the entry... you will delete an entry in 
> use from what I understand.
> 
> The code below triggers an error when updating tunnel_key (error that didn't 
> happen before when updating rows):

Yeah, I figured that. :)

> 
> +            del table.rows[uuid]
> +            table.rows[uuid] = row
> 
> 
> So I suggest just updating the table reference with the already updated row. 
> What do you think?

The setattr method doesn't handle updates, so deletion is necessary.
The fenied approach is temporary here:
  https://github.com/igsilya/ovs/commit/4792aee0dcb97d9aefd182cc3c97865aa501be71

I still need to create a test, so it might change if I find something else.

> 
> $ git diff
> diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
> index a80da84e7..08c5acffb 100644
> --- a/python/ovs/db/idl.py
> +++ b/python/ovs/db/idl.py
> @@ -1014,6 +1014,7 @@ class Idl(object):
>                  raise error.Error('Modify non-existing row')
>  
>              old_row = self.__apply_diff(table, row, row_update['modify'])
> +            table.rows[uuid] = row
>              return Notice(ROW_UPDATE, row, Row(self, table, uuid, old_row))
>          else:
>              raise error.Error('<row-update> unknown operation',
> @@ -1062,6 +1063,7 @@ class Idl(object):
>              if op == ROW_CREATE:
>                  table.rows[uuid] = row
>              if changed:
> +                table.rows[uuid] = row
>                  return Notice(op, row, Row.from_json(self, table, uuid, old))
>          return False
>  
> 
> 
>     CC: Terry.
> 
>     Best regards, Ilya Maximets.
> 
>     >
>     > Kind regards,
>     > Roberto
>     >
>     >
>     > [1] https://paste.openstack.org/show/bqLA7nxfk2C6loD5YlY1/ 
> <https://paste.openstack.org/show/bqLA7nxfk2C6loD5YlY1/>
> 
> 
> 
> /‘Esta mensagem é direcionada apenas para os endereços constantes no 
> cabeçalho inicial. Se você não está listado nos endereços constantes no 
> cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa 
> mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas estão 
> imediatamente anuladas e proibidas’./
> 
> / //‘Apesar do Magazine Luiza tomar todas as precauções razoáveis para 
> assegurar que nenhum vírus esteja presente nesse e-mail, a empresa não poderá 
> aceitar a responsabilidade por quaisquer perdas ou danos causados por esse 
> e-mail ou por seus anexos’./
> 

_______________________________________________
discuss mailing list
disc...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-discuss

Reply via email to