I tried to get this to thread under the "ovsdb-idl: potential issues
with the persistent UUID implementation" thread, but failed. This is
one potential solution to that which mirrors the current C IDL
implementation which seems to work for the most part, but relying on
the fact that hmaps allow duplicate keys wasn't necessarily intended
there. Reading that thread is definitely a prerequisite for
understanding why this patch exists. And it may be better to solve
this some other way, but it seems difficult to do for the case of
"inserting a UUID that already exists" w/o creating a race condition
with multiple IDL clients.

Terry

On Wed, Apr 10, 2024 at 4:39 PM Terry Wilson <twil...@redhat.com> wrote:
>
> The Python IDL code very closely mirrors the C IDL code, which uses
> an hmap to store table rows. hmap code allows duplicate keys, while
> IndexedRows, which is derived from DictBase does not.
>
> The persistent UUID code can attempt to temporarily add a Row with
> a duplicate UUID to table.rows, so IndexedRows is modified to
> behave similarly to the C IDL's hmap implementation.
>
> Fixes: 55b9507e6824 ("ovsdb-idl: Add the support to specify the uuid for row 
> insert.")
> Signed-off-by: Terry Wilson <twil...@redhat.com>
> ---
>  python/ovs/db/custom_index.py | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/python/ovs/db/custom_index.py b/python/ovs/db/custom_index.py
> index 587caf5e3..3fa03d3c9 100644
> --- a/python/ovs/db/custom_index.py
> +++ b/python/ovs/db/custom_index.py
> @@ -90,14 +90,21 @@ class IndexedRows(DictBase, object):
>          index = self.indexes[name] = MultiColumnIndex(name)
>          return index
>
> +    def __getitem__(self, key):
> +        return self.data[key][-1]
> +
>      def __setitem__(self, key, item):
> -        self.data[key] = item
> +        try:
> +            self.data[key].append(item)
> +        except KeyError:
> +            self.data[key] = [item]
>          for index in self.indexes.values():
>              index.add(item)
>
>      def __delitem__(self, key):
> -        val = self.data[key]
> -        del self.data[key]
> +        val = self.data[key].pop()
> +        if len(self.data[key]) == 0:
> +            del self.data[key]
>          for index in self.indexes.values():
>              index.remove(val)
>
> --
> 2.34.3
>

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to