bridge: Don't pay attention to columns that vswitchd doesn't need.
authorBen Pfaff <blp@nicira.com>
Wed, 11 Aug 2010 22:29:36 +0000 (15:29 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 11 Aug 2010 22:41:42 +0000 (15:41 -0700)
Not replicating unneeded columns has some value in avoiding CPU time and
bandwidth to the database.  In ovs-vswitchd, setting cur_cfg as write-only
also have great value in avoiding extra reconfiguration steps.  When
ovs-vsctl is used in its default mode this essentially avoids half of the
reconfigurations that ovs-vswitchd currently does.  What happens now is:

    1. ovs-vsctl updates the database and increments next_cfg.
    2. ovs-vswitchd notices the change to the database, reconfigures
       itself, then increments cur_cfg to match next_cfg.
    3. The database sends the change to cur_cfg back to ovs-vswitchd.
    4. ovs-vswitchd reconfigures itself a second time.

By not replicating cur_cfg we avoid step 3 and save a whole reconfiguration
step.

Also, now that the database contains interface statistics, this avoids
reconfiguring every time that statistics are updated.

lib/ovsdb-idl.c
vswitchd/bridge.c

index 57d7b2a..2132f9f 100644 (file)
@@ -641,11 +641,19 @@ ovsdb_idl_row_update(struct ovsdb_idl_row *row, const struct json *row_json)
         error = ovsdb_datum_from_json(&datum, &column->type, node->data, NULL);
         if (!error) {
             unsigned int column_idx = column - table->class->columns;
-            ovsdb_datum_swap(&row->old[column_idx], &datum);
-            ovsdb_datum_destroy(&datum, &column->type);
-            if (table->modes[column_idx] == OVSDB_IDL_MODE_RW) {
-                changed = true;
+            struct ovsdb_datum *old = &row->old[column_idx];
+
+            if (!ovsdb_datum_equals(old, &datum, &column->type)) {
+                ovsdb_datum_swap(old, &datum);
+                if (table->modes[column_idx] == OVSDB_IDL_MODE_RW) {
+                    changed = true;
+                }
+            } else {
+                /* Didn't really change but the OVSDB monitor protocol always
+                 * includes every value in a row. */
             }
+
+            ovsdb_datum_destroy(&datum, &column->type);
         } else {
             char *s = ovsdb_error_to_string(error);
             VLOG_WARN_RL(&syntax_rl, "error parsing column %s in row "UUID_FMT
index 451708c..b4167f6 100644 (file)
@@ -268,6 +268,19 @@ bridge_init(const char *remote)
     /* Create connection to database. */
     idl = ovsdb_idl_create(remote, &ovsrec_idl_class);
 
+    ovsdb_idl_set_write_only(idl, &ovsrec_open_vswitch_col_cur_cfg);
+    ovsdb_idl_set_write_only(idl, &ovsrec_open_vswitch_col_statistics);
+    ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_external_ids);
+
+    ovsdb_idl_omit(idl, &ovsrec_bridge_col_external_ids);
+
+    ovsdb_idl_omit(idl, &ovsrec_port_col_external_ids);
+    ovsdb_idl_omit(idl, &ovsrec_port_col_fake_bridge);
+
+    ovsdb_idl_set_write_only(idl, &ovsrec_interface_col_ofport);
+    ovsdb_idl_set_write_only(idl, &ovsrec_interface_col_statistics);
+    ovsdb_idl_omit(idl, &ovsrec_interface_col_external_ids);
+
     /* Register unixctl commands. */
     unixctl_command_register("fdb/show", bridge_unixctl_fdb_show, NULL);
     unixctl_command_register("bridge/dump-flows", bridge_unixctl_dump_flows,