Hello,
The UUID comparison was added to guarantee that always rows with the same keys 
are 
sorted in the same way (between executions of a command, for example). Before 
that we
 used the pointer comparison (which gives us some randomness in sorting) but we 
kept it
to be really really sure that we are deleting/inserting the correct row.

The row sync effectively was intended for finding the correct row to delete 
when there are duplicated "index keys" and there are
deletions/updates/inserts (note that the updates are really handled as a 
delete-and-reinsert).

We copied ovsdb_idl_index_read from ovsdb_idl_read because we were concerned of 
what would happen if somebody
access the indexes when a transaction is being made. If the index read the new 
values instead of the old one then
the rows could be lost/wrongly sorted, etc. It is the same story with 
ovsdb_idl_index_write_() and index_set: we 
wanted the indexes to behave correctly during a transaction with new changes.

ovsdb_idl_index_{find,forward_to} are used inside the autogenerated functions 
for iterating over the indexes.
We thought that it would be nice to be able to say things like:

OVSREC_EXAMPLE_FOR_EACH_RANGE(row, cursor, start, end) /* [start, end] */
OVSREC_EXAMPLE_FOR_EACH_RANGE(row, cursor, NULL, end) /* [0, end] */
OVSREC_EXAMPLE_FOR_EACH_RANGE(row, cursor, start, NULL) /* [start, "+infty"] */
OVSREC_EXAMPLE_FOR_EACH_RANGE(row, cursor, NULL, NULL) /* everything */

Regards,
Esteban

-----Original Message-----
From: Lance Richardson [mailto:[email protected]] 
Sent: jueves, 13 de julio de 2017 14:29
To: Ben Pfaff <[email protected]>
Cc: [email protected]; Rodriguez Betancourt, Esteban <[email protected]>; 
Albornoz, Javier <[email protected]>; jorge sauma <[email protected]>; 
Lutz, Arnoldo <[email protected]>
Subject: Re: [ovs-dev] [PATCH v5 3/4] ovsdb-idl: idl compound indexes 
implementation



----- Original Message -----
> From: "Ben Pfaff" <[email protected]>
> To: "Lance Richardson" <[email protected]>
> Cc: [email protected], [email protected], "javier albornoz" 
> <[email protected]>, "jorge sauma"
> <[email protected]>, "arnoldo lutz guevara" 
> <[email protected]>
> 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 <[email protected]>
> > Co-authored-by: Lance Richardson <[email protected]>
> > Signed-off-by: Lance Richardson <[email protected]>
> > ---
> >   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.

Hi Ben,

I neglected to respond to the comment about "index_set functions" in my 
previous response, these are automatically generated for the IDL by the next 
patch. I had deleted that comment in v6 of this series (which is in the ml 
archive but not patchwork for some reason), it didn't seem useful to me.

> 
> 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.
> 
> 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?
> 
> 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.
> 

The "row_sync" stuff seems to be a matter of using additional keys (row uuid 
values first, then memory addresses) when inserting or deleting a row in order 
to handle duplicate keys.

This still seems a bit strange, but after thinking about it a bit I believe it 
is a reasonable approach; these extra keys aren't used when searching, so we 
will always get the first entry in the list when there are multiple rows with 
the same key, and when inserting/deleting we still get O(log N) performance 
when there are many entries with identical keys by searching on the UUID value.

But "row_sync" isn't at all useful in figuring out the above, nor are any of 
the comments in this area.

I also wonder if the comparison on memory address is needed... is there any 
real possibility that two rows in a table will have the same UUID?

Do you think reworking the "row_sync" name and adding better comments would be 
an acceptable way forward here?

Thanks,

   Lance


> Thanks,
> 
> Ben.
> 
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to