[ovs-dev] [PATCH 07/23] db-ctl-base: Don't die in get_row_by_id() on multiple matches.
Mark Michelson
mmichels at redhat.com
Mon Jul 2 14:44:17 UTC 2018
I'm not sure why you went with a different approach on this compared to
the other functions. I would have expected you would change
get_row_by_id() to return a string (NULL if no error, otherwise an error
string). Then return the row as an output parameter.
On 07/02/2018 06:50 AM, Jakub Sitnicki wrote:
> Signal that multiple rows match the record identifier via a new output
> parameter instead of reporting the problem and dying, so that the caller
> can handle the error without terminating the process if needed.
>
> Signed-off-by: Jakub Sitnicki <jkbs at redhat.com>
> ---
> lib/db-ctl-base.c | 23 ++++++++++++++++++-----
> 1 file changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
> index e8f66811a..34daaef68 100644
> --- a/lib/db-ctl-base.c
> +++ b/lib/db-ctl-base.c
> @@ -277,8 +277,11 @@ record_id_equals(const union ovsdb_atom *name, enum ovsdb_atomic_type type,
> static const struct ovsdb_idl_row *
> get_row_by_id(struct ctl_context *ctx,
> const struct ovsdb_idl_table_class *table,
> - const struct ctl_row_id *id, const char *record_id)
> + const struct ctl_row_id *id, const char *record_id,
> + bool *multiple_matches)
> {
> + ovs_assert(multiple_matches);
> + *multiple_matches = false;
>
> if (!id->name_column) {
> return NULL;
> @@ -336,8 +339,8 @@ get_row_by_id(struct ctl_context *ctx,
> /* If the name equals 'record_id', take it. */
> if (record_id_equals(name, name_type, record_id)) {
> if (referrer) {
> - ctl_fatal("multiple rows in %s match \"%s\"",
> - id_table->name, record_id);
> + *multiple_matches = true;
> + return NULL;
> }
> referrer = row;
> }
> @@ -386,8 +389,18 @@ ctl_get_row(struct ctl_context *ctx,
> const struct ctl_table_class *ctl_class
> = &ctl_classes[table - idl_classes];
> for (int i = 0; i < ARRAY_SIZE(ctl_class->row_ids); i++) {
> - row = get_row_by_id(ctx, table, &ctl_class->row_ids[i],
> - record_id);
> + const struct ctl_row_id *id = &ctl_class->row_ids[i];
> + bool multiple_matches;
> +
> + row = get_row_by_id(ctx, table, id, record_id, &multiple_matches);
> + if (multiple_matches) {
> + const struct ovsdb_idl_class *class =
> + ovsdb_idl_get_class(ctx->idl);
> + const struct ovsdb_idl_table_class *table_class =
> + ovsdb_idl_table_class_from_column(class, id->name_column);
> + ctl_fatal("multiple rows in %s match \"%s\"",
> + table_class->name, record_id);
> + }
> if (row) {
> break;
> }
>
More information about the dev
mailing list