diff mbox series

[ovs-dev,05/14] northd: Avoid triggering unnecesary recompute for nb_global changes.

Message ID 20230513000356.2475960-6-hzhou@ovn.org
State Changes Requested
Headers show
Series ovn-northd incremental processing for VIF changes | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_ovn-kubernetes success github build: passed
ovsrobot/github-robot-_Build_and_Test fail github build: failed

Commit Message

Han Zhou May 13, 2023, 12:03 a.m. UTC
For changes such as nb_cfg related columns, don't trigger recompute.

Signed-off-by: Han Zhou <hzhou@ovn.org>
---
 northd/en-northd.c       | 26 ++++++++++++++++++++++++++
 northd/en-northd.h       |  1 +
 northd/inc-proc-northd.c |  3 ++-
 tests/ovn-northd.at      |  6 +++---
 4 files changed, 32 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/northd/en-northd.c b/northd/en-northd.c
index e8f3a844af71..a3dc37e198e3 100644
--- a/northd/en-northd.c
+++ b/northd/en-northd.c
@@ -20,6 +20,7 @@ 
 
 #include "en-northd.h"
 #include "lib/inc-proc-eng.h"
+#include "lib/ovn-nb-idl.h"
 #include "openvswitch/list.h" /* TODO This is needed for ovn-parallel-hmap.h.
                                * lib/ovn-parallel-hmap.h should be updated
                                * to include this dependency itself */
@@ -122,6 +123,31 @@  void en_northd_run(struct engine_node *node, void *data)
     engine_set_node_state(node, EN_UPDATED);
 
 }
+
+bool
+northd_nb_nb_global_handler(struct engine_node *node,
+                            void *data OVS_UNUSED)
+{
+    const struct nbrec_nb_global_table *nb_global_table
+        = EN_OVSDB_GET(engine_get_input("NB_nb_global", node));
+
+    const struct nbrec_nb_global *nb =
+        nbrec_nb_global_table_first(nb_global_table);
+
+    if (!nb) {
+        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+        VLOG_WARN_RL(&rl, "NB_Global is updated but has no record.");
+        return false;
+    }
+
+    /* We care about the 'options' and 'ipsec' columns only. */
+    if (nbrec_nb_global_is_updated(nb, NBREC_NB_GLOBAL_COL_OPTIONS) ||
+        nbrec_nb_global_is_updated(nb, NBREC_NB_GLOBAL_COL_IPSEC)) {
+        return false;
+    }
+    return true;
+}
+
 void *en_northd_init(struct engine_node *node OVS_UNUSED,
                      struct engine_arg *arg OVS_UNUSED)
 {
diff --git a/northd/en-northd.h b/northd/en-northd.h
index 0e7f76245e69..8d8343b459a6 100644
--- a/northd/en-northd.h
+++ b/northd/en-northd.h
@@ -13,5 +13,6 @@  void en_northd_run(struct engine_node *node OVS_UNUSED, void *data OVS_UNUSED);
 void *en_northd_init(struct engine_node *node OVS_UNUSED,
                      struct engine_arg *arg);
 void en_northd_cleanup(void *data);
+bool northd_nb_nb_global_handler(struct engine_node *, void *data OVS_UNUSED);
 
 #endif /* EN_NORTHD_H */
diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c
index d54aa19c7749..863c9323c444 100644
--- a/northd/inc-proc-northd.c
+++ b/northd/inc-proc-northd.c
@@ -141,7 +141,8 @@  void inc_proc_northd_init(struct ovsdb_idl_loop *nb,
 {
     /* Define relationships between nodes where first argument is dependent
      * on the second argument */
-    engine_add_input(&en_northd, &en_nb_nb_global, NULL);
+    engine_add_input(&en_northd, &en_nb_nb_global,
+                     northd_nb_nb_global_handler);
     engine_add_input(&en_northd, &en_nb_logical_switch, NULL);
     engine_add_input(&en_northd, &en_nb_port_group, NULL);
     engine_add_input(&en_northd, &en_nb_load_balancer, NULL);
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 047b8b6ad914..58098fa91c06 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -8657,11 +8657,11 @@  wait_column '20.0.0.4' Address_Set addresses name=pg1_ip4
 recompute_stat=$(as northd ovn-appctl -t NORTHD_TYPE inc-engine/show-stats sync_to_sb_addr_set recompute)
 AT_CHECK([test $recompute_stat -ge 1])
 
-# Any change to northd engine node should result in full recompute of sync_to_sb_addr_set node.
+# No change, no recompute
 check as northd ovn-appctl -t NORTHD_TYPE inc-engine/clear-stats
 check ovn-nbctl --wait=sb sync
-recompute_stat=$(as northd ovn-appctl -t NORTHD_TYPE inc-engine/show-stats sync_to_sb_addr_set recompute)
-AT_CHECK([test $recompute_stat -ge 1])
+AT_CHECK([as northd ovn-appctl -t NORTHD_TYPE inc-engine/show-stats sync_to_sb_addr_set recompute], [0], [0
+])
 
 AT_CLEANUP
 ])