ovs-brcompatd: Don't consume CPU if can't connect to config db
authorJustin Pettit <jpettit@nicira.com>
Thu, 14 Jan 2010 20:20:09 +0000 (12:20 -0800)
committerJustin Pettit <jpettit@nicira.com>
Thu, 14 Jan 2010 21:01:31 +0000 (13:01 -0800)
When ovs-brcompatd can't connect to the database, the "ovs" variable
is never set.  The function "brc_recv_update" takes care of draining
brcompat kernel module's netlink messages.  When the netlink message
comes in to modify the bridge, that function never gets called, so a
netlink message always appears to be ready and we consume 100% CPU
looping.

With this commit, we log a warning and drop the request on the floor.

Bug #2373

vswitchd/ovs-brcompatd.c

index 09225439df6dec2c336ae6d4805409814f48094c..34162f3eb1d831ad4cdd95efaeffdfb7ad01fd30 100644 (file)
@@ -978,6 +978,14 @@ brc_recv_update(const struct ovsrec_open_vswitch *ovs)
         goto error;
     }
 
+    /* Just drop the request on the floor if a valid configuration
+     * doesn't exist.  We don't immediately do this check, because we
+     * want to drain pending netlink messages. */
+    if (!ovs) {
+        VLOG_WARN_RL(&rl, "could not find valid configuration to update");
+        goto error;
+    }
+
     switch (genlmsghdr->cmd) {
     case BRC_GENL_C_DP_ADD:
         handle_bridge_cmd(ovs, buffer, true);
@@ -1180,14 +1188,12 @@ main(int argc, char *argv[])
 
         unixctl_server_run(unixctl);
         ovs = ovsrec_open_vswitch_first(idl);
-        if (ovs) {
-            brc_recv_update(ovs);
-        } else if (ovsdb_idl_get_seqno(idl)) {
+        brc_recv_update(ovs);
+
+        if (!ovs && ovsdb_idl_get_seqno(idl)) {
             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
             VLOG_WARN_RL(&rl, "%s: database does not contain any Open vSwitch "
                          "configuration", remote);
-        } else {
-            /* Haven't yet received initial database contents. */
         }
         netdev_run();