diff mbox series

[ovs-dev,ovn,v7,9/9] ovn-controller: Handle sbrec_chassis changes incrementally.

Message ID 20200520194029.2352187-1-numans@ovn.org
State Superseded
Headers show
Series Incremental processing improvements. | expand

Commit Message

Numan Siddique May 20, 2020, 7:40 p.m. UTC
From: Numan Siddique <numans@ovn.org>

When ovn-controller updates the nb_cfg column of its chassis,
this results in full recomputation on all the nodes. This results
in wastage of CPU cycles. To address this, this patch handles
sbrec_chassis changes incrementally.

We don't need to handle any sbrec_chassis changes during runtime_data
stage, because before engine_run() is called, encaps_run() is called
which will handle any chassis/encap changes.

For new chassis addition and deletion, we need to add/delete flows for
the tunnel ports created/deleted. So physical_run() is called for this.

For any chassis updates, we can ignore this for flow computation.

This patch handles all these.

Acked-by: Mark Michelson <mmichels@redhat.com>
Signed-off-by: Numan Siddique <numans@ovn.org>
---
 controller/ovn-controller.c | 53 ++++++++++++++++++++++++++++++-------
 1 file changed, 43 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index e53f750bf..871f9aa27 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -1381,7 +1381,8 @@  static void init_physical_ctx(struct engine_node *node,
 
     struct sbrec_chassis_table *chassis_table =
         (struct sbrec_chassis_table *)EN_OVSDB_GET(
-            engine_get_input("SB_chassis", node));
+            engine_get_input("SB_chassis",
+                engine_get_input("physical_flow_changes", node)));
 
     struct ed_type_mff_ovn_geneve *ed_mff_ovn_geneve =
         engine_get_input_data("mff_ovn_geneve", node);
@@ -1397,7 +1398,8 @@  static void init_physical_ctx(struct engine_node *node,
     const struct sbrec_chassis *chassis = NULL;
     struct ovsdb_idl_index *sbrec_chassis_by_name =
         engine_ovsdb_node_get_index(
-                engine_get_input("SB_chassis", node),
+                engine_get_input("SB_chassis",
+                    engine_get_input("physical_flow_changes", node)),
                 "name");
     if (chassis_id) {
         chassis = chassis_lookup_by_name(sbrec_chassis_by_name, chassis_id);
@@ -1474,7 +1476,8 @@  static void init_lflow_ctx(struct engine_node *node,
     const struct sbrec_chassis *chassis = NULL;
     struct ovsdb_idl_index *sbrec_chassis_by_name =
         engine_ovsdb_node_get_index(
-                engine_get_input("SB_chassis", node),
+            engine_get_input("SB_chassis",
+                engine_get_input("physical_flow_changes", node)),
                 "name");
     if (chassis_id) {
         chassis = chassis_lookup_by_name(sbrec_chassis_by_name, chassis_id);
@@ -1555,8 +1558,9 @@  en_flow_output_run(struct engine_node *node, void *data)
 
     struct ovsdb_idl_index *sbrec_chassis_by_name =
         engine_ovsdb_node_get_index(
-                engine_get_input("SB_chassis", node),
-                "name");
+            engine_get_input("SB_chassis",
+                engine_get_input("physical_flow_changes", node)),
+            "name");
 
     const struct sbrec_chassis *chassis = NULL;
     if (chassis_id) {
@@ -1721,8 +1725,9 @@  _flow_output_resource_ref_handler(struct engine_node *node, void *data,
 
     struct ovsdb_idl_index *sbrec_chassis_by_name =
         engine_ovsdb_node_get_index(
-                engine_get_input("SB_chassis", node),
-                "name");
+            engine_get_input("SB_chassis",
+                engine_get_input("physical_flow_changes", node)),
+            "name");
     const struct sbrec_chassis *chassis = NULL;
     if (chassis_id) {
         chassis = chassis_lookup_by_name(sbrec_chassis_by_name, chassis_id);
@@ -1873,6 +1878,31 @@  physical_flow_changes_ovs_iface_handler(struct engine_node *node OVS_UNUSED,
     return true;
 }
 
+/* Handles sbrec_chassis changes.
+ * If a new chassis is added or removed return false, so that
+ * physical flows are programmed.
+ * For any updates, there is no need for any flow computation.
+ * Encap changes will also result in sbrec_chassis changes,
+ * but we handle encap changes separately.
+ */
+static bool
+physical_flow_changes_sb_chassis_handler(struct engine_node *node OVS_UNUSED,
+                                         void *data OVS_UNUSED)
+{
+    struct sbrec_chassis_table *chassis_table =
+        (struct sbrec_chassis_table *)EN_OVSDB_GET(
+            engine_get_input("SB_chassis", node));
+
+    const struct sbrec_chassis *ch;
+    SBREC_CHASSIS_TABLE_FOR_EACH_TRACKED (ch, chassis_table) {
+        if (sbrec_chassis_is_deleted(ch) || sbrec_chassis_is_new(ch)) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
 static bool
 flow_output_runtime_data_handler(struct engine_node *node,
                                  void *data OVS_UNUSED)
@@ -2082,6 +2112,10 @@  main(int argc, char *argv[])
                      NULL);
     engine_add_input(&en_physical_flow_changes, &en_ovs_interface,
                      physical_flow_changes_ovs_iface_handler);
+    engine_add_input(&en_physical_flow_changes, &en_sb_chassis,
+                     physical_flow_changes_sb_chassis_handler);
+    engine_add_input(&en_physical_flow_changes, &en_sb_encap,
+                     NULL);
 
     engine_add_input(&en_flow_output, &en_addr_sets,
                      flow_output_addr_sets_handler);
@@ -2096,8 +2130,6 @@  main(int argc, char *argv[])
     engine_add_input(&en_flow_output, &en_ovs_open_vswitch, NULL);
     engine_add_input(&en_flow_output, &en_ovs_bridge, NULL);
 
-    engine_add_input(&en_flow_output, &en_sb_chassis, NULL);
-    engine_add_input(&en_flow_output, &en_sb_encap, NULL);
     engine_add_input(&en_flow_output, &en_sb_multicast_group,
                      flow_output_sb_multicast_group_handler);
     engine_add_input(&en_flow_output, &en_sb_port_binding,
@@ -2124,7 +2156,8 @@  main(int argc, char *argv[])
                      runtime_data_ovs_interface_handler);
     engine_add_input(&en_runtime_data, &en_ovs_qos, NULL);
 
-    engine_add_input(&en_runtime_data, &en_sb_chassis, NULL);
+    engine_add_input(&en_runtime_data, &en_sb_chassis,
+                     runtime_data_noop_handler);
     engine_add_input(&en_runtime_data, &en_sb_datapath_binding,
                      runtime_data_sb_datapath_binding_handler);
     engine_add_input(&en_runtime_data, &en_sb_port_binding,