> From: "Ben Pfaff" <b...@ovn.org> > To: "Lance Richardson" <lrich...@redhat.com> > Cc: d...@openvswitch.org, esteb...@hpe.com, "javier albornoz" > <javier.albor...@hpe.com>, "jorge sauma" > <jorge.sa...@hpe.com>, "arnoldo lutz guevara" <arnoldo.lutz.guev...@hpe.com> > Sent: Tuesday, 11 July, 2017 5:05:32 PM > Subject: Re: [ovs-dev] [PATCH v5 3/4] ovsdb-idl: idl compound indexes > implementation > > On Sat, Jun 24, 2017 at 05:01:51PM -0400, Lance Richardson wrote: > > This patch adds support for the creation of multicolumn indexes > > in the C IDL to enable for efficient search and retrieval of database > > rows by key. > > > > Signed-off-by: Esteban Rodriguez Betancourt <esteb...@hpe.com> > > Co-authored-by: Lance Richardson <lrich...@redhat.com> > > Signed-off-by: Lance Richardson <lrich...@redhat.com> > > --- > > v5: - Coding style fixes (checkpatch.py) > > - Fixed memory leak (missing ovsdb_datum_destroy() in > > ovsdb_idl_index_destroy_row__()). > > - Some polishing of comment and log message text. > > Thanks for reviving this series. > > I don't understand ovsdb_idl_index_read(). It is almost the same as > ovsdb_idl_read(). It looks like ovsdb_idl_read() could be implemented > as a wrapper around it, but I'm also not sure why ovsdb_idl_read() can't > be used directly. Also, I don't understand its comment about "index_set > functions", since there are no functions with index_set in their names. >
I would guess that the original reason had to do with the fact that ovsdb_idl_index_read() needs to deal with "real" rows in the db replica as well as external row instances created by ovsdb_idl_index_init_row() to contain the key values being searched for. Looking at the code a little more closely, I see that ovsdb_idl_index_init_row() sets row->table, so the key row structure would not be considered "synthetic" according to ovsdb_idl_row_is_synthetic(). So: I think you are correct, we should be able to use ovsdb_idl_read() and eliminate ovsdb_idl_index_read(). > ovsdb_idl_index_write_() is mostly copy-paste of a part of > ovsdb_idl_txn_write__(), so to avoid code duplication it would be best > to factor that code out of ovsdb_idl_txn_write__() and call it from both > places. > Hmm, I just noticed that this is v5, v6 seems to be missing in patchwork. The v6 version of this function is a bit more streamlined, and avoids calling ovsdb_datum_destroy() so that a row structure containing a key with a string type can avoid having to xstrdup() key strings: void ovsdb_idl_index_write_(struct ovsdb_idl_row *const_row, const struct ovsdb_idl_column *column, struct ovsdb_datum *datum, const struct ovsdb_idl_table_class *class) { struct ovsdb_idl_row *row = CONST_CAST(struct ovsdb_idl_row *, const_row); size_t column_idx = column - class->columns; if (bitmap_is_set(row->written, column_idx)) { free(row->new[column_idx].values); free(row->new[column_idx].keys); } else { bitmap_set1(row->written, column_idx); } row->new[column_idx] = *datum; (column->unparse)(row); (column->parse)(row, &row->new[column_idx]); } So there's a little less commonality between the two. > I don't understand the behavior of ovsdb_idl_index_find() and > ovsdb_idl_index_forward_to() for a null 'value' argument. Is there some > idiomatic usage where the null and nonnull behaviors work out nicely? > I don't know what the intended use was, but there doesn't currently seem to be a use of the null 'value' case (generated code always passes &data->header_ for this parameter, which could be null if 'data' is null, but that seems pretty fragile if intentional). I'll see if the special-case handling of null values can be eliminated. > The row_sync behavior is confusing. I remember it slightly from the > previous iteration but I don't remember being convinced it was the best > way to do things. > Hmm, that does seem strange/confusing. I will have to spend more time studying that bit of conde. > Thanks, > > Ben. > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev