From 6530be3ba04e4679824709c922eb501bcb77806e Mon Sep 17 00:00:00 2001 From: Andy Zhou Date: Fri, 17 Jul 2015 16:39:07 -0700 Subject: [PATCH] db-ctl-base: remove the recurse member from struct cmd_show_table The 'recurse' is used during run time to suppress duplicated prints. It is not essential to describe how show command should work. This patch remove the 'recurse' member. Duplicated prints is now suppressed by maintaining an 'sset' of tables that have been printed at run time. Signed-off-by: Andy Zhou Acked-by: Ben Pfaff --- lib/db-ctl-base.c | 20 ++++++++++++++------ lib/db-ctl-base.h | 4 ---- utilities/ovs-vsctl.c | 26 +++++++++++++------------- vtep/vtep-ctl.c | 22 +++++++++++----------- 4 files changed, 38 insertions(+), 34 deletions(-) diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c index 09efd8d9f03..a1d6e4ea9d3 100644 --- a/lib/db-ctl-base.c +++ b/lib/db-ctl-base.c @@ -34,6 +34,7 @@ #include "ovsdb-idl.h" #include "ovsdb-idl-provider.h" #include "shash.h" +#include "sset.h" #include "string.h" #include "table.h" #include "util.h" @@ -1648,9 +1649,12 @@ cmd_show_find_table_by_name(const char *name) return NULL; } +/* 'shown' records the tables that has been displayed by the current + * command to avoid duplicated prints. + */ static void cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row, - int level) + int level, struct sset *shown) { struct cmd_show_table *show = cmd_show_find_table_by_row(row); size_t i; @@ -1667,11 +1671,11 @@ cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row, } ds_put_char(&ctx->output, '\n'); - if (!show || show->recurse) { + if (!show || sset_find(shown, show->table->name)) { return; } - show->recurse = true; + sset_add(shown, show->table->name); for (i = 0; i < ARRAY_SIZE(show->columns); i++) { const struct ovsdb_idl_column *column = show->columns[i]; const struct ovsdb_datum *datum; @@ -1696,7 +1700,7 @@ cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row, ref_show->table, &datum->keys[j].uuid); if (ref_row) { - cmd_show_row(ctx, ref_row, level + 1); + cmd_show_row(ctx, ref_row, level + 1, shown); } } continue; @@ -1749,18 +1753,22 @@ cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row, ds_put_char(&ctx->output, '\n'); } } - show->recurse = false; + sset_find_and_delete_assert(shown, show->table->name); } static void cmd_show(struct ctl_context *ctx) { const struct ovsdb_idl_row *row; + struct sset shown = SSET_INITIALIZER(&shown); for (row = ovsdb_idl_first_row(ctx->idl, cmd_show_tables[0].table); row; row = ovsdb_idl_next_row(row)) { - cmd_show_row(ctx, row, 0); + cmd_show_row(ctx, row, 0, &shown); } + + ovs_assert(sset_is_empty(&shown)); + sset_destroy(&shown); } diff --git a/lib/db-ctl-base.h b/lib/db-ctl-base.h index 9220ecec6ab..aff242bf94a 100644 --- a/lib/db-ctl-base.h +++ b/lib/db-ctl-base.h @@ -157,15 +157,11 @@ struct ctl_command *ctl_parse_commands(int argc, char *argv[], * * - 'columns[]' allows user to specify the print of additional columns * in 'table'. - * - * - 'recurse' is used to avoid duplicate print. - * * */ struct cmd_show_table { const struct ovsdb_idl_table_class *table; const struct ovsdb_idl_column *name_column; const struct ovsdb_idl_column *columns[3]; /* Seems like a good number. */ - bool recurse; }; /* This array defines the 'show' command output format. User can check the diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index 4fb88b11777..ce05c470e20 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -980,45 +980,45 @@ struct cmd_show_table cmd_show_tables[] = { NULL, {&ovsrec_open_vswitch_col_manager_options, &ovsrec_open_vswitch_col_bridges, - &ovsrec_open_vswitch_col_ovs_version}, - false}, + &ovsrec_open_vswitch_col_ovs_version} + }, {&ovsrec_table_bridge, &ovsrec_bridge_col_name, {&ovsrec_bridge_col_controller, &ovsrec_bridge_col_fail_mode, - &ovsrec_bridge_col_ports}, - false}, + &ovsrec_bridge_col_ports} + }, {&ovsrec_table_port, &ovsrec_port_col_name, {&ovsrec_port_col_tag, &ovsrec_port_col_trunks, - &ovsrec_port_col_interfaces}, - false}, + &ovsrec_port_col_interfaces} + }, {&ovsrec_table_interface, &ovsrec_interface_col_name, {&ovsrec_interface_col_type, &ovsrec_interface_col_options, - &ovsrec_interface_col_error}, - false}, + &ovsrec_interface_col_error} + }, {&ovsrec_table_controller, &ovsrec_controller_col_target, {&ovsrec_controller_col_is_connected, NULL, - NULL}, - false}, + NULL} + }, {&ovsrec_table_manager, &ovsrec_manager_col_target, {&ovsrec_manager_col_is_connected, NULL, - NULL}, - false}, + NULL} + }, - {NULL, NULL, {NULL, NULL, NULL}, false} + {NULL, NULL, {NULL, NULL, NULL}} }; static void diff --git a/vtep/vtep-ctl.c b/vtep/vtep-ctl.c index be8fd56488a..98afbdada17 100644 --- a/vtep/vtep-ctl.c +++ b/vtep/vtep-ctl.c @@ -369,38 +369,38 @@ struct cmd_show_table cmd_show_tables[] = { NULL, {&vteprec_global_col_managers, &vteprec_global_col_switches, - NULL}, - false}, + NULL} + }, {&vteprec_table_manager, &vteprec_manager_col_target, {&vteprec_manager_col_is_connected, NULL, - NULL}, - false}, + NULL} + }, {&vteprec_table_physical_switch, &vteprec_physical_switch_col_name, {&vteprec_physical_switch_col_management_ips, &vteprec_physical_switch_col_tunnel_ips, - &vteprec_physical_switch_col_ports}, - false}, + &vteprec_physical_switch_col_ports} + }, {&vteprec_table_physical_port, &vteprec_physical_port_col_name, {&vteprec_physical_port_col_vlan_bindings, NULL, - NULL}, - false}, + NULL} + }, {&vteprec_table_logical_switch, &vteprec_logical_switch_col_name, {NULL, NULL, - NULL}, - false}, + NULL} + }, - {NULL, NULL, {NULL, NULL, NULL}, false} + {NULL, NULL, {NULL, NULL, NULL}} }; /* vtep-ctl specific context. Inherits the 'struct ctl_context' as base. */