[ovs-dev] [cfm_v2 2/9] bridge: Write CFM changes more aggressively.

Ethan Jackson ethan at nicira.com
Fri Sep 9 18:45:56 UTC 2011


This patch no longer rate limits database updates due to CFM
changes.  Due to recent changes, the fault status of CFM only
changes once per 3.5 tx_interval seconds.  There doesn't seem to be
a good reason to add an additional rate limit on top of this.
---
 vswitchd/bridge.c |   46 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index ada82ff..99fa761 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -197,7 +197,7 @@ static void iface_set_mac(struct iface *);
 static void iface_set_ofport(const struct ovsrec_interface *, int64_t ofport);
 static void iface_configure_qos(struct iface *, const struct ovsrec_qos *);
 static void iface_configure_cfm(struct iface *);
-static bool iface_refresh_cfm_stats(struct iface *);
+static void iface_refresh_cfm_stats(struct iface *);
 static void iface_refresh_stats(struct iface *);
 static void iface_refresh_status(struct iface *);
 static bool iface_get_carrier(const struct iface *);
@@ -1258,27 +1258,18 @@ iface_refresh_status(struct iface *iface)
 
 /* Writes 'iface''s CFM statistics to the database.  Returns true if anything
  * changed, false otherwise. */
-static bool
+static void
 iface_refresh_cfm_stats(struct iface *iface)
 {
     const struct ovsrec_interface *cfg = iface->cfg;
-    bool changed = false;
     int fault;
 
     fault = ofproto_port_get_cfm_fault(iface->port->bridge->ofproto,
                                        iface->ofp_port);
-
-    if (fault < 0) {
-        return false;
-    }
-
-    if (cfg->n_cfm_fault != 1 || cfg->cfm_fault[0] != fault) {
+    if (fault >= 0) {
         bool fault_bool = fault;
         ovsrec_interface_set_cfm_fault(cfg, &fault_bool, 1);
-        changed = true;
     }
-
-    return changed;
 }
 
 static bool
@@ -1422,6 +1413,31 @@ refresh_controller_status(void)
     ofproto_free_ofproto_controller_info(&info);
 }
 
+static void
+refresh_cfm_stats(void)
+{
+    static struct ovsdb_idl_txn *txn = NULL;
+
+    if (!txn) {
+        struct bridge *br;
+
+        txn = ovsdb_idl_txn_create(idl);
+
+        HMAP_FOR_EACH (br, node, &all_bridges) {
+            struct iface *iface;
+
+            HMAP_FOR_EACH (iface, name_node, &br->iface_by_name) {
+                iface_refresh_cfm_stats(iface);
+            }
+        }
+    }
+
+    if (ovsdb_idl_txn_commit(txn) != TXN_INCOMPLETE) {
+        ovsdb_idl_txn_destroy(txn);
+        txn = NULL;
+    }
+}
+
 void
 bridge_run(void)
 {
@@ -1531,7 +1547,9 @@ bridge_run(void)
                 struct iface *iface;
 
                 LIST_FOR_EACH (iface, port_elem, &port->ifaces) {
-                    changed = iface_refresh_cfm_stats(iface) || changed;
+                    /* XXX: Eventually we need to remove the lacp_current flag
+                     * from the database so that we can completely get rid of
+                     * this rate limiter code. */
                     changed = iface_refresh_lacp_stats(iface) || changed;
                 }
             }
@@ -1544,6 +1562,8 @@ bridge_run(void)
         ovsdb_idl_txn_commit(txn);
         ovsdb_idl_txn_destroy(txn);
     }
+
+    refresh_cfm_stats();
 }
 
 void
-- 
1.7.6.1




More information about the dev mailing list