On Thu, Sep 20, 2012 at 02:48:54PM -0700, Ethan Jackson wrote: > ovs-vswitchd should only write to write-only columns. Furthermore, > writing to a column which is not write-only can cause serious > performance degradations. This patch causes ovs-vswitchd to log > and reject writes to read-write columns. > > Signed-off-by: Ethan Jackson <et...@nicira.com>
Thanks! This should be really helpful. I did notice a couple of things, see below. > @@ -1832,12 +1842,20 @@ ovsdb_idl_txn_write(const struct ovsdb_idl_row *row_, > > class = row->table->class; > column_idx = column - class->columns; > + write_only = row->table->modes[column_idx] & OVSDB_IDL_MONITOR; I think that at the least the name here is misleading. The OVSDB_IDL_MONITOR flag is set if the IDL will monitor a particular column. Thus, it is set for read-only, write-only, and (if we really did this) read/write columns. To test for a write-only column, use == instead of &. > assert(row->new != NULL); > assert(column_idx < class->n_columns); > assert(row->old == NULL || > row->table->modes[column_idx] & OVSDB_IDL_MONITOR); > > + if (row->table->idl->verify_write_only && !write_only) { > + VLOG_ERR("Attempt to write to a read/write column (%s:%s) when" > + " explicitly configured not to.", class->name, > column->name); It might be nice to add something like "internal error" or "bug" somewhere in there, to make it clear that this isn't related to anything the user did. > + ovsdb_datum_destroy(datum, &column->type); > + return; > + } > + > /* If this is a write-only column and the datum being written is the same > * as the one already there, just skip the update entirely. This is > worth > * optimizing because we have a lot of columns that get periodically > @@ -1849,9 +1867,8 @@ ovsdb_idl_txn_write(const struct ovsdb_idl_row *row_, > * transaction only does writes of existing values, without making any > real > * changes, we will drop the whole transaction later in > * ovsdb_idl_txn_commit().) */ > - if (row->table->modes[column_idx] == OVSDB_IDL_MONITOR > - && ovsdb_datum_equals(ovsdb_idl_read(row, column), > - datum, &column->type)) { (See, there's the correct test.) > + if (write_only && ovsdb_datum_equals(ovsdb_idl_read(row, column), > + datum, &column->type)) { > ovsdb_datum_destroy(datum, &column->type); > return; > } _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev