On Wed, Aug 18, 2021 at 8:43 PM <num...@ovn.org> wrote:
>
> From: Numan Siddique <nusid...@redhat.com>
>
> This patch adds 2 new APIs in the ovsdb-idl client library
>  - ovsdb_idl_has_table() and ovsdb_idl_has_column_in_table() to
> query if a table and a column is present in the IDL or not.  This
> is required for scenarios where the server schema is old and
> missing a table or column and the client (built with a new schema
> version) does a transaction with the missing table or column.  This
> results in a continuous loop of transaction failures.
>
> OVN would require the API - ovsdb_idl_has_table() to address this issue
> when an old ovsdb-server is used (OVS 2.11) which has the 'datapath'
> table missing.  A recent commit in OVN creates a 'datapath' row
> in the local ovsdb-server.  ovsdb_idl_has_column_in_table() would be
> useful to have.
>
> Related issue: https://bugzilla.redhat.com/show_bug.cgi?id=1992705
> Signed-off-by: Numan Siddique <nusid...@redhat.com>
> ---
>  lib/ovsdb-idl.c | 25 +++++++++++++++++++++++++
>  lib/ovsdb-idl.h |  4 ++++
>  2 files changed, 29 insertions(+)
>
> diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
> index 2198c69c6..c5795fb7f 100644
> --- a/lib/ovsdb-idl.c
> +++ b/lib/ovsdb-idl.c
> @@ -4256,3 +4256,28 @@ ovsdb_idl_loop_commit_and_wait(struct ovsdb_idl_loop 
> *loop)
>
>      return retval;
>  }
> +
> +bool
> +ovsdb_idl_has_table(struct ovsdb_idl *idl, const char *table_name)
> +{
> +    struct ovsdb_idl_table *table = shash_find_data(&idl->table_by_name,
> +                                                    table_name);
> +    return table ? true: false;
> +}
> +
> +bool
> +ovsdb_idl_has_column_in_table(struct ovsdb_idl *idl, const char *table_name,
> +                              const char *column_name)
> +{
> +    struct ovsdb_idl_table *table = shash_find_data(&idl->table_by_name,
> +                                                    table_name);
> +    if (!table) {
> +        return false;
> +    }
> +
> +    if (shash_find_data(&table->columns, column_name)) {
> +        return true;
> +    }
> +
> +    return false;
Why not use ovsdb_idl_has_table you created and make this function
more concise? I would have done:

if (ovsdb_idl_has_table(idl, table_name) &&
    shash_find_data(&table->columns, column_name))
    return true;
return false;

I dont know if this breaks any coding conventions though :)

Otherwise LGTM
> +}
> diff --git a/lib/ovsdb-idl.h b/lib/ovsdb-idl.h
> index d93483245..216db4c6d 100644
> --- a/lib/ovsdb-idl.h
> +++ b/lib/ovsdb-idl.h
> @@ -474,6 +474,10 @@ void ovsdb_idl_cursor_next_eq(struct ovsdb_idl_cursor *);
>
>  struct ovsdb_idl_row *ovsdb_idl_cursor_data(struct ovsdb_idl_cursor *);
>
> +bool ovsdb_idl_has_table(struct ovsdb_idl *idl, const char *table_name);
> +bool ovsdb_idl_has_column_in_table(struct ovsdb_idl *idl,
> +                                   const char *table_name,
> +                                   const char *column_name);
>  #ifdef __cplusplus
>  }
>  #endif
> --
> 2.31.1
>
> _______________________________________________
> 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

Reply via email to