[ovs-dev] [PATCH ovn] northd: I-P: fix BFD dependency.

Dumitru Ceara dceara at redhat.com
Wed Nov 24 00:51:47 UTC 2021


BFD entries are updated and their ->ref field is set to 'true' when
static routes are parsed, within build_lflows(), in the 'en_lflow' I-P
node.  Therefore we cannot clean up BFD entries in 'en_northd' which is
an input of 'en_lflow'.

To fix this we now move all BFD handling in the 'en_lflow' node.

This fixes the CI failures that we've recently started hitting when
running the ovn-kubernetes jobs, for example:
https://github.com/ovn-org/ovn/runs/4294661249?check_suite_focus=true#step:10:9154

Fixes: 1fa6612ffebf ("northd: Add lflow node")
Signed-off-by: Dumitru Ceara <dceara at redhat.com>
---
 northd/en-lflow.c        |  8 ++++++++
 northd/en-northd.c       |  4 ----
 northd/inc-proc-northd.c |  4 ++--
 northd/northd.c          | 11 ++++-------
 northd/northd.h          | 11 +++++++++--
 tests/ovn-northd.at      |  8 ++++++++
 6 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/northd/en-lflow.c b/northd/en-lflow.c
index 5bef35cf6..ffbdaf4e8 100644
--- a/northd/en-lflow.c
+++ b/northd/en-lflow.c
@@ -38,6 +38,10 @@ void en_lflow_run(struct engine_node *node, void *data OVS_UNUSED)
 
     struct northd_data *northd_data = engine_get_input_data("northd", node);
 
+    lflow_input.nbrec_bfd_table =
+        EN_OVSDB_GET(engine_get_input("NB_bfd", node));
+    lflow_input.sbrec_bfd_table =
+        EN_OVSDB_GET(engine_get_input("SB_bfd", node));
     lflow_input.sbrec_logical_flow_table =
         EN_OVSDB_GET(engine_get_input("SB_logical_flow", node));
     lflow_input.sbrec_multicast_group_table =
@@ -60,7 +64,11 @@ void en_lflow_run(struct engine_node *node, void *data OVS_UNUSED)
                       northd_data->ovn_internal_version_changed;
 
     stopwatch_start(BUILD_LFLOWS_STOPWATCH_NAME, time_msec());
+    build_bfd_table(&lflow_input, eng_ctx->ovnsb_idl_txn,
+                    &northd_data->bfd_connections,
+                    &northd_data->ports);
     build_lflows(&lflow_input, eng_ctx->ovnsb_idl_txn);
+    bfd_cleanup_connections(&lflow_input, &northd_data->bfd_connections);
     stopwatch_stop(BUILD_LFLOWS_STOPWATCH_NAME, time_msec());
 
     engine_set_node_state(node, EN_UPDATED);
diff --git a/northd/en-northd.c b/northd/en-northd.c
index 0523560f8..79da7e1c4 100644
--- a/northd/en-northd.c
+++ b/northd/en-northd.c
@@ -66,8 +66,6 @@ void en_northd_run(struct engine_node *node, void *data)
         EN_OVSDB_GET(engine_get_input("NB_load_balancer", node));
     input_data.nbrec_port_group_table =
         EN_OVSDB_GET(engine_get_input("NB_port_group", node));
-    input_data.nbrec_bfd_table =
-        EN_OVSDB_GET(engine_get_input("NB_bfd", node));
     input_data.nbrec_address_set_table =
         EN_OVSDB_GET(engine_get_input("NB_address_set", node));
     input_data.nbrec_meter_table =
@@ -93,8 +91,6 @@ void en_northd_run(struct engine_node *node, void *data)
         EN_OVSDB_GET(engine_get_input("SB_load_balancer", node));
     input_data.sbrec_service_monitor_table =
         EN_OVSDB_GET(engine_get_input("SB_service_monitor", node));
-    input_data.sbrec_bfd_table =
-        EN_OVSDB_GET(engine_get_input("SB_bfd", node));
     input_data.sbrec_address_set_table =
         EN_OVSDB_GET(engine_get_input("SB_address_set", node));
     input_data.sbrec_port_group_table =
diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c
index 8e7428dda..c02c5a44a 100644
--- a/northd/inc-proc-northd.c
+++ b/northd/inc-proc-northd.c
@@ -178,7 +178,6 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb,
     engine_add_input(&en_northd, &en_nb_gateway_chassis, NULL);
     engine_add_input(&en_northd, &en_nb_ha_chassis_group, NULL);
     engine_add_input(&en_northd, &en_nb_ha_chassis, NULL);
-    engine_add_input(&en_northd, &en_nb_bfd, NULL);
 
     engine_add_input(&en_northd, &en_sb_sb_global, NULL);
     engine_add_input(&en_northd, &en_sb_chassis, NULL);
@@ -206,8 +205,9 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb,
     engine_add_input(&en_northd, &en_sb_ip_multicast, NULL);
     engine_add_input(&en_northd, &en_sb_service_monitor, NULL);
     engine_add_input(&en_northd, &en_sb_load_balancer, NULL);
-    engine_add_input(&en_northd, &en_sb_bfd, NULL);
     engine_add_input(&en_northd, &en_sb_fdb, NULL);
+    engine_add_input(&en_lflow, &en_nb_bfd, NULL);
+    engine_add_input(&en_lflow, &en_sb_bfd, NULL);
     engine_add_input(&en_lflow, &en_sb_logical_flow, NULL);
     engine_add_input(&en_lflow, &en_sb_multicast_group, NULL);
     engine_add_input(&en_lflow, &en_sb_igmp_group, NULL);
diff --git a/northd/northd.c b/northd/northd.c
index 2b7dd5980..c57026081 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -8348,8 +8348,8 @@ bfd_port_lookup(const struct hmap *bfd_map, const char *logical_port,
     return NULL;
 }
 
-static void
-bfd_cleanup_connections(struct northd_input *input_data,
+void
+bfd_cleanup_connections(struct lflow_input *input_data,
                         struct hmap *bfd_map)
 {
     const struct nbrec_bfd *nb_bt;
@@ -8432,8 +8432,8 @@ static int bfd_get_unused_port(unsigned long *bfd_src_ports)
     return port + BFD_UDP_SRC_PORT_START;
 }
 
-static void
-build_bfd_table(struct northd_input *input_data,
+void
+build_bfd_table(struct lflow_input *input_data,
                 struct ovsdb_idl_txn *ovnsb_txn,
                 struct hmap *bfd_connections, struct hmap *ports)
 {
@@ -14935,8 +14935,6 @@ ovnnb_db_run(struct northd_input *input_data,
     build_lrouter_groups(&data->ports, &data->lr_list);
     build_ip_mcast(input_data, ovnsb_txn, &data->datapaths);
     build_meter_groups(input_data, &data->meter_groups);
-    build_bfd_table(input_data,
-                    ovnsb_txn, &data->bfd_connections, &data->ports);
     stopwatch_stop(BUILD_LFLOWS_CTX_STOPWATCH_NAME, time_msec());
     stopwatch_start(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec());
     ovn_update_ipv6_prefix(&data->ports);
@@ -14946,7 +14944,6 @@ ovnnb_db_run(struct northd_input *input_data,
     sync_meters(input_data, ovnsb_txn, &data->meter_groups);
     sync_dns_entries(input_data, ovnsb_txn, &data->datapaths);
     cleanup_stale_fdp_entries(input_data, &data->datapaths);
-    bfd_cleanup_connections(input_data, &data->bfd_connections);
     stopwatch_stop(CLEAR_LFLOWS_CTX_STOPWATCH_NAME, time_msec());
 }
 
diff --git a/northd/northd.h b/northd/northd.h
index 07cf66f71..ebcb40de7 100644
--- a/northd/northd.h
+++ b/northd/northd.h
@@ -25,7 +25,6 @@ struct northd_input {
     const struct nbrec_logical_router_table *nbrec_logical_router;
     const struct nbrec_load_balancer_table *nbrec_load_balancer_table;
     const struct nbrec_port_group_table *nbrec_port_group_table;
-    const struct nbrec_bfd_table *nbrec_bfd_table;
     const struct nbrec_address_set_table *nbrec_address_set_table;
     const struct nbrec_meter_table *nbrec_meter_table;
     const struct nbrec_acl_table *nbrec_acl_table;
@@ -40,7 +39,6 @@ struct northd_input {
     const struct sbrec_fdb_table *sbrec_fdb_table;
     const struct sbrec_load_balancer_table *sbrec_load_balancer_table;
     const struct sbrec_service_monitor_table *sbrec_service_monitor_table;
-    const struct sbrec_bfd_table *sbrec_bfd_table;
     const struct sbrec_address_set_table *sbrec_address_set_table;
     const struct sbrec_port_group_table *sbrec_port_group_table;
     const struct sbrec_meter_table *sbrec_meter_table;
@@ -68,7 +66,11 @@ struct northd_data {
 };
 
 struct lflow_input {
+    /* Northbound table references */
+    const struct nbrec_bfd_table *nbrec_bfd_table;
+
     /* Southbound table references */
+    const struct sbrec_bfd_table *sbrec_bfd_table;
     const struct sbrec_logical_flow_table *sbrec_logical_flow_table;
     const struct sbrec_multicast_group_table *sbrec_multicast_group_table;
     const struct sbrec_igmp_group_table *sbrec_igmp_group_table;
@@ -95,5 +97,10 @@ void northd_indices_create(struct northd_data *data,
                            struct ovsdb_idl *ovnsb_idl);
 void build_lflows(struct lflow_input *input_data,
                   struct ovsdb_idl_txn *ovnsb_txn);
+void build_bfd_table(struct lflow_input *input_data,
+                     struct ovsdb_idl_txn *ovnsb_txn,
+                     struct hmap *bfd_connections, struct hmap *ports);
+void bfd_cleanup_connections(struct lflow_input *input_data,
+                             struct hmap *bfd_map);
 
 #endif /* NORTHD_H */
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 316e5a535..670efd496 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -3219,6 +3219,14 @@ wait_column admin_down bfd status logical_port=r0-sw1
 ovn-nbctl destroy bfd $uuid
 wait_row_count bfd 5
 
+# Simulate BFD up in Southbound for an automatically created entry.
+# This entry is referenced so the state in the Northbound should also
+# become "up".
+wait_column down nb:bfd status logical_port=r0-sw2
+bfd2_uuid=$(fetch_column bfd _uuid logical_port=r0-sw2)
+check ovn-sbctl set bfd $bfd2_uuid status=up
+wait_column up nb:bfd status logical_port=r0-sw2
+
 AT_CLEANUP
 ])
 
-- 
2.27.0



More information about the dev mailing list