Return the error message to the caller instead of reporting it and dying so that the caller can handle the error without terminating the process if needed.
Signed-off-by: Jakub Sitnicki <[email protected]> --- lib/db-ctl-base.c | 49 +++++++++++++++++++++++++++-------------------- lib/db-ctl-base.h | 7 +++---- ovn/utilities/ovn-sbctl.c | 11 ++++++++--- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c index 34daaef68..431db91c3 100644 --- a/lib/db-ctl-base.c +++ b/lib/db-ctl-base.c @@ -366,14 +366,16 @@ get_row_by_id(struct ctl_context *ctx, return final; } -const struct ovsdb_idl_row * +char * OVS_WARN_UNUSED_RESULT ctl_get_row(struct ctl_context *ctx, const struct ovsdb_idl_table_class *table, const char *record_id, - bool must_exist) + bool must_exist, const struct ovsdb_idl_row **rowp) { const struct ovsdb_idl_row *row = NULL; struct uuid uuid; + ovs_assert(rowp); + if (uuid_from_string(&uuid, record_id)) { row = ovsdb_idl_get_row_for_uuid(ctx->idl, table, &uuid); } @@ -398,8 +400,8 @@ ctl_get_row(struct ctl_context *ctx, 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); + return xasprintf("multiple rows in %s match \"%s\"", + table_class->name, record_id); } if (row) { break; @@ -415,19 +417,21 @@ ctl_get_row(struct ctl_context *ctx, if (!row) { row = r; } else { - ctl_fatal("%s contains 2 or more rows whose UUIDs begin " - "with %s: at least "UUID_FMT" and "UUID_FMT, - table->name, record_id, - UUID_ARGS(&row->uuid), - UUID_ARGS(&r->uuid)); + return xasprintf("%s contains 2 or more rows whose UUIDs " + "begin with %s: at least "UUID_FMT" " + "and "UUID_FMT, table->name, record_id, + UUID_ARGS(&row->uuid), + UUID_ARGS(&r->uuid)); } } } } if (must_exist && !row) { - ctl_fatal("no row \"%s\" in table %s", record_id, table->name); + return xasprintf("no row \"%s\" in table %s", record_id, table->name); } - return row; + + *rowp = row; + return NULL; } static char * @@ -888,7 +892,7 @@ cmd_get(struct ctl_context *ctx) } die_if_error(get_table(table_name, &table)); - row = ctl_get_row(ctx, table, record_id, must_exist); + die_if_error(ctl_get_row(ctx, table, record_id, must_exist, &row)); if (!row) { return; } @@ -1123,8 +1127,11 @@ cmd_list(struct ctl_context *ctx) out = ctx->table = list_make_table(columns, n_columns); if (ctx->argc > 2) { for (i = 2; i < ctx->argc; i++) { - list_record(ctl_get_row(ctx, table, ctx->argv[i], must_exist), - columns, n_columns, out); + const struct ovsdb_idl_row *row; + + die_if_error(ctl_get_row(ctx, table, ctx->argv[i], must_exist, + &row)); + list_record(row, columns, n_columns, out); } } else { const struct ovsdb_idl_row *row; @@ -1315,7 +1322,7 @@ cmd_set(struct ctl_context *ctx) int i; die_if_error(get_table(table_name, &table)); - row = ctl_get_row(ctx, table, record_id, must_exist); + die_if_error(ctl_get_row(ctx, table, record_id, must_exist, &row)); if (!row) { return; } @@ -1355,7 +1362,7 @@ cmd_add(struct ctl_context *ctx) die_if_error(get_table(table_name, &table)); die_if_error(get_column(table, column_name, &column)); - row = ctl_get_row(ctx, table, record_id, must_exist); + die_if_error(ctl_get_row(ctx, table, record_id, must_exist, &row)); if (!row) { return; } @@ -1416,7 +1423,7 @@ cmd_remove(struct ctl_context *ctx) die_if_error(get_table(table_name, &table)); die_if_error(get_column(table, column_name, &column)); - row = ctl_get_row(ctx, table, record_id, must_exist); + die_if_error(ctl_get_row(ctx, table, record_id, must_exist, &row)); if (!row) { return; } @@ -1487,7 +1494,7 @@ cmd_clear(struct ctl_context *ctx) int i; die_if_error(get_table(table_name, &table)); - row = ctl_get_row(ctx, table, record_id, must_exist); + die_if_error(ctl_get_row(ctx, table, record_id, must_exist, &row)); if (!row) { return; } @@ -1628,7 +1635,8 @@ cmd_destroy(struct ctl_context *ctx) for (i = 2; i < ctx->argc; i++) { const struct ovsdb_idl_row *row; - row = ctl_get_row(ctx, table, ctx->argv[i], must_exist); + die_if_error(ctl_get_row(ctx, table, ctx->argv[i], must_exist, + &row)); if (row) { ovsdb_idl_txn_delete(row); } @@ -1661,8 +1669,7 @@ cmd_wait_until(struct ctl_context *ctx) int i; die_if_error(get_table(table_name, &table)); - - row = ctl_get_row(ctx, table, record_id, false); + die_if_error(ctl_get_row(ctx, table, record_id, false, &row)); if (!row) { ctx->try_again = true; return; diff --git a/lib/db-ctl-base.h b/lib/db-ctl-base.h index 6aa3fe62d..5599666f2 100644 --- a/lib/db-ctl-base.h +++ b/lib/db-ctl-base.h @@ -272,10 +272,9 @@ struct ctl_table_class { struct ctl_row_id row_ids[4]; }; -const struct ovsdb_idl_row *ctl_get_row(struct ctl_context *, - const struct ovsdb_idl_table_class *, - const char *record_id, - bool must_exist); +char *ctl_get_row(struct ctl_context *, const struct ovsdb_idl_table_class *, + const char *record_id, bool must_exist, + const struct ovsdb_idl_row **); void ctl_set_column(const char *table_name, const struct ovsdb_idl_row *, const char *arg, diff --git a/ovn/utilities/ovn-sbctl.c b/ovn/utilities/ovn-sbctl.c index 085f7c5c0..0e2c67c08 100644 --- a/ovn/utilities/ovn-sbctl.c +++ b/ovn/utilities/ovn-sbctl.c @@ -842,9 +842,14 @@ cmd_lflow_list(struct ctl_context *ctx) { const struct sbrec_datapath_binding *datapath = NULL; if (ctx->argc > 1) { - datapath = (const struct sbrec_datapath_binding *) - ctl_get_row(ctx, &sbrec_table_datapath_binding, - ctx->argv[1], false); + const struct ovsdb_idl_row *row; + char *error = ctl_get_row(ctx, &sbrec_table_datapath_binding, + ctx->argv[1], false, &row); + if (error) { + ctl_fatal("%s", error); + } + + datapath = (const struct sbrec_datapath_binding *)row; if (datapath) { ctx->argc--; ctx->argv++; -- 2.14.4 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
