[ovs-dev] [PATCH] OVN python IDL: avoid useless JSON conversion to enhance performance

Terry Wilson twilson at redhat.com
Tue Feb 27 20:44:49 UTC 2018


On Tue, Feb 27, 2018 at 9:25 AM, Daniel Alvarez <dalvarez at redhat.com> wrote:
> This patch removes a useless conversion to/from JSON in the
> processing of any 'modify' operations inside the process_update2
> method in Python IDL implementation.
>
> Previous code will make resources creation take longer as the number
> of elements in the row grows because of that JSON conversion. This
> patch eliminates it and now the time remains consant regardless
> of the database contents improving performance and scaling.
>
> Reported-by: Daniel Alvarez Sanchez <dalvarez at redhat.com>
> Reported-at: https://mail.openvswitch.org/pipermail/ovs-discuss/2018-February/046263.html
> Signed-off-by: Daniel Alvarez <dalvarez at redhat.com>
> ---
>  python/ovs/db/idl.py | 12 +++++-------
>  1 file changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py
> index 60548bcf5..5a4d129c0 100644
> --- a/python/ovs/db/idl.py
> +++ b/python/ovs/db/idl.py
> @@ -518,10 +518,8 @@ class Idl(object):
>              if not row:
>                  raise error.Error('Modify non-existing row')
>
> -            old_row_diff_json = self.__apply_diff(table, row,
> -                                                  row_update['modify'])
> -            self.notify(ROW_UPDATE, row,
> -                        Row.from_json(self, table, uuid, old_row_diff_json))
> +            old_row = self.__apply_diff(table, row, row_update['modify'])
> +            self.notify(ROW_UPDATE, row, Row(self, table, uuid, old_row))
>              changed = True
>          else:
>              raise error.Error('<row-update> unknown operation',
> @@ -584,7 +582,7 @@ class Idl(object):
>                          row_update[column.name] = self.__column_name(column)
>
>      def __apply_diff(self, table, row, row_diff):
> -        old_row_diff_json = {}
> +        old_row = {}
>          for column_name, datum_diff_json in six.iteritems(row_diff):
>              column = table.columns.get(column_name)
>              if not column:
> @@ -601,12 +599,12 @@ class Idl(object):
>                            % (column_name, table.name, e))
>                  continue
>
> -            old_row_diff_json[column_name] = row._data[column_name].to_json()
> +            old_row[column_name] = row._data[column_name].copy()
>              datum = row._data[column_name].diff(datum_diff)
>              if datum != row._data[column_name]:
>                  row._data[column_name] = datum
>
> -        return old_row_diff_json
> +        return old_row
>
>      def __row_update(self, table, row, row_json):
>          changed = False
> --
> 2.13.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

+1

This passes all of the functional tests in ovsdbapp when applied. Nice find!

Terry


More information about the dev mailing list