[ovs-dev] [bug15983 4/4] bridge: Only complete daemonization after db commits initial config.

Ben Pfaff blp at nicira.com
Wed Apr 10 23:24:21 UTC 2013


On Wed, Apr 10, 2013 at 01:42:29PM -0700, Ansis Atteka wrote:
> One thing I noticed - if you will try to add invalid remote from "db:",
> then parse_db_column() might fail and call ovs_fatal(). Seems a little
> harsh...

Oops.

Here's an incremental for the commit that adds add-remote to fix
that.  It requires an additional preparation commit that I'll send out
in a bit as part of a complete revised series.

diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
index 39bc98e..61095e2 100644
--- a/ovsdb/ovsdb-server.c
+++ b/ovsdb/ovsdb-server.c
@@ -75,6 +75,12 @@ static bool bootstrap_ca_cert;
 static unixctl_cb_func ovsdb_server_exit;
 static unixctl_cb_func ovsdb_server_compact;
 static unixctl_cb_func ovsdb_server_reconnect;
+
+struct add_remote_aux {
+    struct sset *remotes;
+    struct db *dbs;
+    size_t n_dbs;
+};
 static unixctl_cb_func ovsdb_server_add_remote;
 static unixctl_cb_func ovsdb_server_remove_remote;
 static unixctl_cb_func ovsdb_server_list_remotes;
@@ -104,6 +110,7 @@ main(int argc, char *argv[])
     bool exiting;
     int retval;
     long long int status_timer = LLONG_MIN;
+    struct add_remote_aux add_remote_aux;
 
     struct db *dbs;
     int n_dbs;
@@ -183,8 +190,12 @@ main(int argc, char *argv[])
                              ovsdb_server_compact, dbs);
     unixctl_command_register("ovsdb-server/reconnect", "", 0, 0,
                              ovsdb_server_reconnect, jsonrpc);
+
+    add_remote_aux.remotes = &remotes;
+    add_remote_aux.dbs = dbs;
+    add_remote_aux.n_dbs = n_dbs;
     unixctl_command_register("ovsdb-server/add-remote", "REMOTE", 1, 1,
-                             ovsdb_server_add_remote, &remotes);
+                             ovsdb_server_add_remote, &add_remote_aux);
     unixctl_command_register("ovsdb-server/remove-remote", "REMOTE", 1, 1,
                              ovsdb_server_remove_remote, &remotes);
     unixctl_command_register("ovsdb-server/list-remotes", "", 0, 0,
@@ -888,12 +899,27 @@ ovsdb_server_reconnect(struct unixctl_conn *conn, int argc OVS_UNUSED,
  * ovsdb-server services. */
 static void
 ovsdb_server_add_remote(struct unixctl_conn *conn, int argc OVS_UNUSED,
-                        const char *argv[], void *remotes_)
+                        const char *argv[], void *aux_)
 {
-    struct sset *remotes = remotes_;
+    struct add_remote_aux *aux = aux_;
+    const char *remote = argv[1];
 
-    sset_add(remotes, argv[1]);
-    unixctl_command_reply(conn, NULL);
+    const struct ovsdb_column *column;
+    const struct ovsdb_table *table;
+    const struct db *db;
+    char *retval;
+
+    retval = (strncmp("db:", remote, 3)
+              ? NULL
+              : parse_db_column(aux->dbs, aux->n_dbs, remote,
+                                &db, &table, &column));
+    if (!retval) {
+        sset_add(aux->remotes, remote);
+        unixctl_command_reply(conn, NULL);
+    } else {
+        unixctl_command_reply_error(conn, retval);
+        free(retval);
+    }
 }
 
 /* "ovsdb-server/remove-remote REMOTE": removes REMOTE frmo the set of remotes
diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at
index d310912..50f95bd 100644
--- a/tests/ovsdb-server.at
+++ b/tests/ovsdb-server.at
@@ -253,6 +253,11 @@ AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/list-remotes],
 punix:socket2
 ])
 
+AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-remote db:x,y,z], [2],
+  [], ["db:x,y,z": no database named x
+ovs-appctl: ovsdb-server: server returned an error
+])
+
 AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/remove-remote punix:socket1])
 OVS_WAIT_UNTIL([test ! -e socket1])
 AT_CHECK([test -S socket2])




More information about the dev mailing list