[ovs-dev] [PATCH] db-ctl-base: Allow print rows that weak reference to table in 'cmd_show_table'.

Justin Pettit jpettit at nicira.com
Thu Aug 13 08:00:04 UTC 2015


Awesome!  I tested it, and it looks good.  Thanks so much.

--Justin


> On Aug 13, 2015, at 12:55 AM, Alex Wang <alexw at nicira.com> wrote:
> 
> Adopted all suggestions and fixed unittest,
> 
> Applied to master~
> 
> Thanks,
> Alex Wang,
> 
> On Thu, Aug 13, 2015 at 12:17 AM, Alex Wang <alexw at nicira.com> wrote:
> Hey Justin,
> 
> Thx for the responsive review~
> 
> On Wed, Aug 12, 2015 at 11:58 PM, Justin Pettit <jpettit at nicira.com> wrote:
> I should have added that if you use the attached patch, you'll need to update the ovn-sbctl unit test you were nice enough to include in this patch.
> 
> --Justin
> 
> 
> > On Aug 12, 2015, at 11:52 PM, Justin Pettit <jpettit at nicira.com> wrote:
> >
> >
> >> On Aug 12, 2015, at 9:49 PM, Alex Wang <alexw at nicira.com> wrote:
> >>
> >> diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
> >> index 3028c09..cbafff1 100644
> >> --- a/lib/db-ctl-base.c
> >> +++ b/lib/db-ctl-base.c
> >> @@ -1620,6 +1620,12 @@ pre_cmd_show(struct ctl_context *ctx)
> >>                ovsdb_idl_add_column(ctx->idl, column);
> >>            }
> >>        }
> >> +        if (show->wref_table.name_column) {
> >> +            ovsdb_idl_add_column(ctx->idl, show->wref_table.name_column);
> >> +        }
> >> +        if (show->wref_table.wref_column) {
> >> +            ovsdb_idl_add_column(ctx->idl, show->wref_table.wref_column);
> >> +        }
> >
> > Do you need to do a ovsdb_idl_add_table() on 'wref_table.table'?
> >
> 
> Yeah, I should do that,
>  
> >> +/*  Prints table entries that weak reference the 'cur_row'. */
> >> +static void
> >> +cmd_show_weak_ref(struct ctl_context *ctx, const struct cmd_show_table *show,
> >> +                  const struct ovsdb_idl_row *cur_row, int level)
> >> +{
> >> +    const struct ovsdb_idl_row *row_wref;
> >> +    const struct ovsdb_idl_table_class *table = show->wref_table.table;
> >> +    const struct ovsdb_idl_column *name_column
> >> +        = show->wref_table.name_column;
> >> +    const struct ovsdb_idl_column *wref_column
> >> +        = show->wref_table.wref_column;
> >> +
> >> +    if (!table || !name_column || !wref_column) {
> >> +        return;
> >> +    }
> >> +
> >> +    ds_put_char_multiple(&ctx->output, ' ', (level + 1) * 4);
> >> +    ds_put_format(&ctx->output, "%s", table->name);
> >> +    ds_put_char(&ctx->output, '\n');
> >> +
> >> +    for (row_wref = ovsdb_idl_first_row(ctx->idl, table); row_wref;
> >> +         row_wref = ovsdb_idl_next_row(row_wref)) {
> >> +        const struct ovsdb_datum *wref_datum
> >> +            = ovsdb_idl_read(row_wref, wref_column);
> >> +        /* If weak reference refers to the 'cur_row', prints it. */
> >> +        if (wref_datum->n
> >> +            && uuid_equals(&cur_row->uuid, &wref_datum->keys[0].uuid)) {
> >> +            const struct ovsdb_datum *name_datum
> >> +                = ovsdb_idl_read(row_wref, name_column);
> >> +
> >> +            ds_put_char_multiple(&ctx->output, ' ', (level + 2) * 4);
> >> +            ds_put_format(&ctx->output, "%s: ", name_column->name);
> >> +            ovsdb_datum_to_string(name_datum, &name_column->type, &ctx->output);
> >> +            ds_put_char(&ctx->output, '\n');
> >> +        }
> >> +    }
> >> +}
> >
> > I think this causes the "ovn-controller-vtep" test case to fail due to the text printing before the "for" loop; that gets printed regardless of whether there are any matches or not.  I originally wrote a patch to just not print that preamble if there were no matches.  However, I think the attached patch might be more consistent with commands like "ovs-vsctl show" which print the root name for a row on the same line as the table name.  It also passes the unit tests.
> >
> 
> Sorry forget to run all tests,
> 
>  
> > For example, here's the output of the original patch:
> >
> > -=-=-=-=-=-=-=-=-=-=-
> > Chassis "56b18105-5706-46ef-80c4-ff20979ab068"
> >    Encap geneve
> >        ip: "127.0.0.1"
> >    Port_Binding
> >        logical_port: "sw0-port0"
> >        logical_port: "sw0-port1"
> > -=-=-=-=-=-=-=-=-=-=-
> >
> > Here it is with the attached patch:
> >
> > -=-=-=-=-=-=-=-=-=-=-
> > Chassis "56b18105-5706-46ef-80c4-ff20979ab068"
> >    Encap geneve
> >        ip: "127.0.0.1"
> >    Port_Binding "sw0-port0"
> >    Port_Binding "sw0-port1"
> > -=-=-=-=-=-=-=-=-=-=-
> >
> > Does that seem reasonable?  If we later want to add other columns from Port_Binding, they can then be placed under each entry.
> 
> Yeah, totally makes sense,
> 
> >
> >> @@ -157,11 +168,16 @@ struct ctl_command *ctl_parse_commands(int argc, char *argv[],
> >> *
> >> * - 'columns[]' allows user to specify the print of additional columns
> >> *   in 'table'.
> >> + *
> >> + * - if 'wref_table' is filled, print the 'wref_table.table' rows that refer
> >> + *   to the 'table'.
> >
> > What do you think of this phrasing instead?  I think it's a bit more descriptive.
> >
> > * - if 'wref_table' is populated, print 'wref_table.name_column' for
> > *   each row in table 'wref_table.table' that has a reference to 'table'
> > *   in 'wref_table.wref_column'.  Every field must be populated.
> >
> 
> This is more comprehensive, thx, will adopt it,
> 
>  
> > Thanks a lot for doing this on short notice!
> >
> > Acked-by: Justin Pettit <jpettit at nicira.com>
> >
> > --Justin
> >
> >
> > -=-=-=-=-=-=-=-=-=-=-=-=-
> >
> > diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
> > index cbafff1..142428e 100644
> > --- a/lib/db-ctl-base.c
> > +++ b/lib/db-ctl-base.c
> > @@ -1671,10 +1671,6 @@ cmd_show_weak_ref(struct ctl_context *ctx, const struct c
> >         return;
> >     }
> >
> > -    ds_put_char_multiple(&ctx->output, ' ', (level + 1) * 4);
> > -    ds_put_format(&ctx->output, "%s", table->name);
> > -    ds_put_char(&ctx->output, '\n');
> > -
> >     for (row_wref = ovsdb_idl_first_row(ctx->idl, table); row_wref;
> >          row_wref = ovsdb_idl_next_row(row_wref)) {
> >         const struct ovsdb_datum *wref_datum
> > @@ -1685,8 +1681,8 @@ cmd_show_weak_ref(struct ctl_context *ctx, const struct cm
> >             const struct ovsdb_datum *name_datum
> >                 = ovsdb_idl_read(row_wref, name_column);
> >
> > -            ds_put_char_multiple(&ctx->output, ' ', (level + 2) * 4);
> > -            ds_put_format(&ctx->output, "%s: ", name_column->name);
> > +            ds_put_char_multiple(&ctx->output, ' ', (level + 1) * 4);
> > +            ds_put_format(&ctx->output, "%s ", table->name);
> >             ovsdb_datum_to_string(name_datum, &name_column->type, &ctx->output)
> >             ds_put_char(&ctx->output, '\n');
> >         }
> >
> >
> 
> 
> 




More information about the dev mailing list