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 <[email protected]> --- 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 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
