Recheck-request: github-robot-_ovn-kubernetes Em qua., 22 de abr. de 2026 às 11:04, Lucas Vargas Dias < [email protected]> escreveu:
> Recheck-request: github-robot > > Em ter., 21 de abr. de 2026 às 18:12, Lucas Vargas Dias < > [email protected]> escreveu: > >> Create a handler for deleted and updated static routes, >> and change the handler from engine route which check if >> it has a new static route created. >> Test with 2000 static routes created in the same logical router >> and add a new one: >> Without the incremental processing: >> ovn-nbctl --print-wait-time --wait=sb lr-route-add lr1-2 10.0.0.1/32 >> 192.168.20.2 >> Time spent on processing nb_cfg 4: >> ovn-northd delay before processing: 4ms >> ovn-northd completion: 62ms >> >> With the incremental processing: >> ovn-nbctl --print-wait-time --wait=sb lr-route-add lr1-2 10.0.0.1/32 >> 192.168.20.2 >> Time spent on processing nb_cfg 6: >> ovn-northd delay before processing: 4ms >> ovn-northd completion: 21ms >> >> Test with 2000 static routes created in the same logical router >> and delete one: >> Without the incremental processing: >> ovn-nbctl --print-wait-time --wait=sb lr-route-del lr1-2 10.0.0.1/32 >> 192.168.20.2 >> Time spent on processing nb_cfg 5: >> ovn-northd delay before processing: 3ms >> ovn-northd completion: 62ms >> >> With the incremental processing: >> ovn-nbctl --print-wait-time --wait=sb lr-route-del lr1-2 10.0.0.1/32 >> 192.168.20.2 >> Time spent on processing nb_cfg 9: >> ovn-northd delay before processing: 2ms >> ovn-northd completion: 32ms >> >> Signed-off-by: Lucas Vargas Dias <[email protected]> >> --- >> northd/en-group-ecmp-route.c | 57 ++++++++++ >> northd/en-group-ecmp-route.h | 4 + >> northd/en-lflow.c | 20 ++++ >> northd/en-lflow.h | 2 + >> northd/en-northd.c | 186 +++++++++++++++++++++++++++---- >> northd/en-northd.h | 5 +- >> northd/inc-proc-northd.c | 13 ++- >> northd/northd.c | 107 +++++++++++++----- >> northd/northd.h | 38 ++++++- >> tests/ovn-inc-proc-graph-dump.at | 6 +- >> tests/ovn-northd.at | 98 +++++++++++++--- >> 11 files changed, 466 insertions(+), 70 deletions(-) >> >> diff --git a/northd/en-group-ecmp-route.c b/northd/en-group-ecmp-route.c >> index c4c93fd84..fcc76b076 100644 >> --- a/northd/en-group-ecmp-route.c >> +++ b/northd/en-group-ecmp-route.c >> @@ -519,3 +519,60 @@ group_ecmp_route_learned_route_change_handler(struct >> engine_node *eng_node, >> } >> return EN_HANDLED_UNCHANGED; >> } >> + >> +enum engine_input_handler_result >> +group_ecmp_static_route_change_handler(struct engine_node *eng_node, >> + void *_data) >> +{ >> + struct routes_data *routes_data >> + = engine_get_input_data("routes", eng_node); >> + struct group_ecmp_route_data *data = _data; >> + if (!routes_data->tracked) { >> + data->tracked = false; >> + return EN_UNHANDLED; >> + } >> + >> + struct parsed_route *pr; >> + struct hmapx updated_routes = HMAPX_INITIALIZER(&updated_routes); >> + >> + const struct hmapx_node *hmapx_node; >> + HMAPX_FOR_EACH (hmapx_node, >> + &routes_data->trk_data.trk_deleted_parsed_route) { >> + pr = hmapx_node->data; >> + if (!handle_deleted_route(data, pr, &updated_routes)) { >> + hmapx_destroy(&updated_routes); >> + return EN_UNHANDLED; >> + } >> + >> + if (pr->is_in_parsed_routes) { >> + hmap_remove(&routes_data->parsed_routes, &pr->key_node); >> + } >> + parsed_route_free(pr); >> + } >> + >> + HMAPX_FOR_EACH (hmapx_node, >> + &routes_data->trk_data.trk_crupdated_parsed_route) { >> + pr = hmapx_node->data; >> + handle_added_route(data, pr, &updated_routes); >> + } >> + >> + HMAPX_FOR_EACH (hmapx_node, &updated_routes) { >> + struct group_ecmp_datapath *node = hmapx_node->data; >> + if (hmap_is_empty(&node->unique_routes) && >> + hmap_is_empty(&node->ecmp_groups)) { >> + hmapx_add(&data->trk_data.deleted_datapath_routes, node); >> + hmap_remove(&data->datapaths, &node->hmap_node); >> + } else { >> + hmapx_add(&data->trk_data.crupdated_datapath_routes, node); >> + } >> + } >> + >> + hmapx_destroy(&updated_routes); >> + >> + if (!hmapx_is_empty(&data->trk_data.crupdated_datapath_routes) || >> + !hmapx_is_empty(&data->trk_data.deleted_datapath_routes)) { >> + data->tracked = true; >> + return EN_HANDLED_UPDATED; >> + } >> + return EN_HANDLED_UNCHANGED; >> +} >> diff --git a/northd/en-group-ecmp-route.h b/northd/en-group-ecmp-route.h >> index d4a3248d0..246ca06bf 100644 >> --- a/northd/en-group-ecmp-route.h >> +++ b/northd/en-group-ecmp-route.h >> @@ -98,6 +98,10 @@ enum engine_input_handler_result >> group_ecmp_route_learned_route_change_handler(struct engine_node *, >> void *data); >> >> +enum engine_input_handler_result >> +group_ecmp_static_route_change_handler(struct engine_node *, >> + void *data); >> + >> struct group_ecmp_datapath *group_ecmp_datapath_lookup( >> const struct group_ecmp_route_data *data, >> const struct ovn_datapath *od); >> diff --git a/northd/en-lflow.c b/northd/en-lflow.c >> index d4351edb9..22cd8fe91 100644 >> --- a/northd/en-lflow.c >> +++ b/northd/en-lflow.c >> @@ -297,6 +297,21 @@ lflow_multicast_igmp_handler(struct engine_node >> *node, void *data) >> return EN_HANDLED_UPDATED; >> } >> >> +enum engine_input_handler_result >> +lflow_group_route_change_handler(struct engine_node *node, >> + void *data OVS_UNUSED) >> +{ >> + struct routes_data *route_data = >> + engine_get_input_data("routes", node); >> + >> + /* If we do not have tracked data we need to recompute. */ >> + if (!route_data->tracked) { >> + return EN_UNHANDLED; >> + } >> + >> + return EN_HANDLED_UNCHANGED; >> +} >> + >> enum engine_input_handler_result >> lflow_group_ecmp_route_change_handler(struct engine_node *node, >> void *data OVS_UNUSED) >> @@ -346,6 +361,11 @@ lflow_group_ecmp_route_change_handler(struct >> engine_node *node, >> route_node->od, lflow_data->lflow_table, >> route_node, lflow_input.bfd_ports); >> >> + build_arp_request_flows_for_lrouter(route_node->od, >> + lflow_data->lflow_table, >> + lflow_input.meter_groups, >> + route_node->lflow_ref); >> + >> bool handled = lflow_ref_sync_lflows( >> route_node->lflow_ref, lflow_data->lflow_table, >> eng_ctx->ovnsb_idl_txn, lflow_input.dps, >> diff --git a/northd/en-lflow.h b/northd/en-lflow.h >> index d2a92e49f..aa320615f 100644 >> --- a/northd/en-lflow.h >> +++ b/northd/en-lflow.h >> @@ -31,5 +31,7 @@ lflow_multicast_igmp_handler(struct engine_node *node, >> void *data); >> enum engine_input_handler_result >> lflow_group_ecmp_route_change_handler(struct engine_node *node, void >> *data); >> enum engine_input_handler_result >> +lflow_group_route_change_handler(struct engine_node *node, void *data); >> +enum engine_input_handler_result >> lflow_ic_learned_svc_mons_handler(struct engine_node *node, void *data); >> #endif /* EN_LFLOW_H */ >> diff --git a/northd/en-northd.c b/northd/en-northd.c >> index c34818dba..c05939a1d 100644 >> --- a/northd/en-northd.c >> +++ b/northd/en-northd.c >> @@ -207,7 +207,8 @@ northd_nb_logical_router_handler(struct engine_node >> *node, >> } >> >> if (northd_has_lr_nats_in_tracked_data(&nd->trk_data) || >> - northd_has_lrouters_in_tracked_data(&nd->trk_data)) { >> + northd_has_lrouters_in_tracked_data(&nd->trk_data) || >> + northd_has_lr_route_in_tracked_data(&nd->trk_data)) { >> return EN_HANDLED_UPDATED; >> } >> >> @@ -329,32 +330,174 @@ en_route_policies_run(struct engine_node *node, >> void *data) >> >> enum engine_input_handler_result >> routes_northd_change_handler(struct engine_node *node, >> - void *data OVS_UNUSED) >> + void *data) >> { >> struct northd_data *northd_data = engine_get_input_data("northd", >> node); >> if (!northd_has_tracked_data(&northd_data->trk_data)) { >> return EN_UNHANDLED; >> } >> >> - /* This node uses the below data from the en_northd engine node. >> - * See (lr_stateful_get_input_data()) >> - * 1. northd_data->lr_datapaths >> - * 2. northd_data->lr_ports >> - * This data gets updated when a logical router or logical >> router port >> - * is created or deleted. >> - * Northd engine node presently falls back to full recompute >> when >> - * this happens and so does this node. >> - * Note: When we add I-P to the created/deleted logical routers >> or >> - * logical router ports, we need to revisit this handler. >> - * >> - * This node also accesses the static routes of the logical >> router. >> - * When these static routes gets updated, en_northd engine >> recomputes >> - * and so does this node. >> - * Note: When we add I-P to handle static routes changes, we >> need >> - * to revisit this handler. >> - */ >> + if (!northd_has_lr_route_in_tracked_data(&northd_data->trk_data)) { >> + return EN_HANDLED_UNCHANGED; >> + } >> + >> + struct bfd_data *bfd_data = engine_get_input_data("bfd", node); >> + struct routes_data *routes_data = data; >> + struct hmapx_node *hmapx_node; >> + struct ovn_datapath *od; >> + HMAPX_FOR_EACH (hmapx_node, &northd_data->trk_data.trk_lrs_routes) { >> + od = hmapx_node->data; >> + struct parsed_route *pr; >> + >> + for (int i = 0; i < od->nbr->n_static_routes; i++) { >> + struct nbrec_logical_router_static_route *static_route = >> + od->nbr->static_routes[i]; >> + pr = parsed_route_lookup_by_source(ROUTE_SOURCE_STATIC, >> + &static_route->header_, >> + >> &routes_data->parsed_routes); >> + if (pr) { >> + pr->stale = false; >> + continue; >> + } >> + pr = parsed_routes_add_static(od, &northd_data->lr_ports, >> + static_route, >> + &bfd_data->bfd_connections, >> + &routes_data->parsed_routes, >> + &routes_data->route_tables, >> + >> &routes_data->bfd_active_connections); >> + if (!pr) { >> + continue; >> + } >> + hmapx_add(&routes_data->trk_data.trk_crupdated_parsed_route, >> + pr); >> + } >> + } >> + >> + if >> (!hmapx_is_empty(&routes_data->trk_data.trk_crupdated_parsed_route)) { >> + routes_data->tracked = true; >> + return EN_HANDLED_UPDATED; >> + } >> + >> return EN_HANDLED_UNCHANGED; >> } >> +enum engine_input_handler_result >> +routes_static_route_change_handler(struct engine_node *node, >> + void *data) >> +{ >> + struct routes_data *routes_data = data; >> + struct hmapx created_trk_parsed_route = >> + HMAPX_INITIALIZER(&created_trk_parsed_route); >> + const struct nbrec_logical_router_static_route_table * >> + nb_lr_static_route_table = >> + EN_OVSDB_GET(engine_get_input("NB_logical_router_static_route", >> node)); >> + >> + struct northd_data *northd_data = engine_get_input_data("northd", >> node); >> + struct bfd_data *bfd_data = engine_get_input_data("bfd", node); >> + >> + const struct nbrec_logical_router_static_route *changed_static_route; >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_TABLE_FOR_EACH_TRACKED ( >> + changed_static_route, >> nb_lr_static_route_table) { >> + >> + bool is_deleted = nbrec_logical_router_static_route_is_deleted( >> + >> changed_static_route); >> + bool is_new = nbrec_logical_router_static_route_is_new( >> + >> changed_static_route); >> + >> + if (is_new && is_deleted) { >> + continue; >> + } >> + >> + if (is_new) { >> + hmapx_add(&created_trk_parsed_route, &changed_static_route); >> + continue; >> + } >> + >> + if (is_deleted) { >> + struct parsed_route *pr = parsed_route_lookup_by_source( >> + ROUTE_SOURCE_STATIC, >> + >> &changed_static_route->header_, >> + &routes_data->parsed_routes); >> + if (!pr) { >> + pr = >> parsed_route_lookup_by_source(ROUTE_SOURCE_IC_DYNAMIC, >> + >> &changed_static_route->header_, >> + &routes_data->parsed_routes); >> + } >> + if (pr) { >> + pr->stale = true; >> + >> hmapx_add(&routes_data->trk_data.trk_deleted_parsed_route, pr); >> + } >> + continue; >> + } >> + >> + if (nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_NEXTHOP) >> + || nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_IP_PREFIX) >> + || nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_OUTPUT_PORT) >> + || nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_POLICY) >> + || nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_ROUTE_TABLE) >> + || nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + >> NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_SELECTION_FIELDS) >> + || nbrec_logical_router_static_route_is_updated( >> + changed_static_route, >> + NBREC_LOGICAL_ROUTER_STATIC_ROUTE_COL_OPTIONS)) { >> + struct parsed_route *pr = parsed_route_lookup_by_source( >> + ROUTE_SOURCE_STATIC, >> + >> &changed_static_route->header_, >> + &routes_data->parsed_routes); >> + if (!pr) { >> + pr = parsed_route_lookup_by_source( >> + ROUTE_SOURCE_IC_DYNAMIC, >> + >> &changed_static_route->header_, >> + >> &routes_data->parsed_routes); >> + } >> + >> + if (!pr || !pr->od || !northd_data || !bfd_data) { >> + continue; >> + } >> + struct parsed_route *old_pr = pr; >> + hmap_remove(&routes_data->parsed_routes, &old_pr->key_node); >> + pr = parsed_routes_add_static(old_pr->od, >> &northd_data->lr_ports, >> + changed_static_route, >> + &bfd_data->bfd_connections, >> + &routes_data->parsed_routes, >> + &routes_data->route_tables, >> + >> &routes_data->bfd_active_connections); >> + old_pr->is_in_parsed_routes = false; >> + if (!pr) { >> + continue; >> + } >> + >> + hmapx_add(&routes_data->trk_data.trk_crupdated_parsed_route, >> + pr); >> + hmapx_add(&routes_data->trk_data.trk_deleted_parsed_route, >> + old_pr); >> + } >> + } >> + if >> (!hmapx_is_empty(&routes_data->trk_data.trk_crupdated_parsed_route) || >> + >> !hmapx_is_empty(&routes_data->trk_data.trk_deleted_parsed_route)) { >> + hmapx_destroy(&created_trk_parsed_route); >> + routes_data->tracked = true; >> + return EN_HANDLED_UPDATED; >> + } >> + >> + if (!hmapx_is_empty(&created_trk_parsed_route)) { >> + hmapx_destroy(&created_trk_parsed_route); >> + return EN_HANDLED_UPDATED; >> + } >> + >> + hmapx_destroy(&created_trk_parsed_route); >> + return EN_UNHANDLED; >> +} >> >> enum engine_node_state >> en_routes_run(struct engine_node *node, void *data) >> @@ -590,6 +733,11 @@ en_routes_cleanup(void *data) >> routes_destroy(data); >> } >> >> +void >> +en_routes_clear_tracked_data(void *data) >> +{ >> + routes_clear_tracked(data); >> +} >> void >> en_bfd_cleanup(void *data) >> { >> diff --git a/northd/en-northd.h b/northd/en-northd.h >> index 7794739b9..5247f3e11 100644 >> --- a/northd/en-northd.h >> +++ b/northd/en-northd.h >> @@ -39,9 +39,12 @@ enum engine_node_state en_route_policies_run(struct >> engine_node *node, >> void *data); >> void *en_route_policies_init(struct engine_node *node OVS_UNUSED, >> struct engine_arg *arg OVS_UNUSED); >> +void en_routes_clear_tracked_data(void *data); >> void en_routes_cleanup(void *data); >> enum engine_input_handler_result >> -routes_northd_change_handler(struct engine_node *node, void *data >> OVS_UNUSED); >> +routes_northd_change_handler(struct engine_node *node, void *data); >> +enum engine_input_handler_result >> +routes_static_route_change_handler(struct engine_node *node, void *data); >> enum engine_node_state en_routes_run(struct engine_node *node, void >> *data); >> void *en_bfd_init(struct engine_node *node OVS_UNUSED, >> struct engine_arg *arg OVS_UNUSED); >> diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c >> index ece388ce7..52f5dc57f 100644 >> --- a/northd/inc-proc-northd.c >> +++ b/northd/inc-proc-northd.c >> @@ -76,7 +76,9 @@ static unixctl_cb_func chassis_features_list; >> NB_NODE(sampling_app) \ >> NB_NODE(network_function) \ >> NB_NODE(network_function_group) \ >> - NB_NODE(logical_switch_port_health_check) >> + NB_NODE(logical_switch_port_health_check) \ >> + NB_NODE(logical_router_static_route) >> + >> >> enum nb_engine_node { >> #define NB_NODE(NAME) NB_##NAME, >> @@ -179,7 +181,7 @@ static ENGINE_NODE(lr_stateful, CLEAR_TRACKED_DATA); >> static ENGINE_NODE(ls_stateful, CLEAR_TRACKED_DATA); >> static ENGINE_NODE(ls_arp, CLEAR_TRACKED_DATA); >> static ENGINE_NODE(route_policies); >> -static ENGINE_NODE(routes); >> +static ENGINE_NODE(routes, CLEAR_TRACKED_DATA); >> static ENGINE_NODE(bfd); >> static ENGINE_NODE(bfd_sync, SB_WRITE); >> static ENGINE_NODE(ecmp_nexthop, SB_WRITE); >> @@ -341,6 +343,8 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, >> engine_add_input(&en_routes, &en_bfd, NULL); >> engine_add_input(&en_routes, &en_northd, >> routes_northd_change_handler); >> + engine_add_input(&en_routes, &en_nb_logical_router_static_route, >> + routes_static_route_change_handler); >> >> engine_add_input(&en_bfd_sync, &en_bfd, NULL); >> engine_add_input(&en_bfd_sync, &en_nb_bfd, NULL); >> @@ -380,7 +384,8 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, >> engine_add_input(&en_learned_route_sync, &en_northd, >> learned_route_sync_northd_change_handler); >> >> - engine_add_input(&en_group_ecmp_route, &en_routes, NULL); >> + engine_add_input(&en_group_ecmp_route, &en_routes, >> + group_ecmp_static_route_change_handler); >> engine_add_input(&en_group_ecmp_route, &en_learned_route_sync, >> group_ecmp_route_learned_route_change_handler); >> >> @@ -399,7 +404,7 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, >> engine_add_input(&en_lflow, &en_sb_logical_dp_group, NULL); >> engine_add_input(&en_lflow, &en_bfd_sync, NULL); >> engine_add_input(&en_lflow, &en_route_policies, NULL); >> - engine_add_input(&en_lflow, &en_routes, NULL); >> + engine_add_input(&en_lflow, &en_routes, >> lflow_group_route_change_handler); >> /* XXX: The incremental processing only supports changes to learned >> routes. >> * All other changes trigger a full recompute. */ >> engine_add_input(&en_lflow, &en_group_ecmp_route, >> diff --git a/northd/northd.c b/northd/northd.c >> index 4fd4b9de9..ea48bc442 100644 >> --- a/northd/northd.c >> +++ b/northd/northd.c >> @@ -4517,6 +4517,7 @@ destroy_northd_data_tracked_changes(struct >> northd_data *nd) >> destroy_tracked_ovn_ports(&trk_changes->trk_lsps); >> destroy_tracked_lbs(&trk_changes->trk_lbs); >> hmapx_clear(&trk_changes->trk_nat_lrs); >> + hmapx_clear(&trk_changes->trk_lrs_routes); >> hmapx_clear(&trk_changes->ls_with_changed_lbs); >> hmapx_clear(&trk_changes->ls_with_changed_acls); >> hmapx_clear(&trk_changes->ls_with_changed_ipam); >> @@ -4540,6 +4541,7 @@ init_northd_tracked_data(struct northd_data *nd) >> hmapx_init(&trk_data->trk_lbs.crupdated); >> hmapx_init(&trk_data->trk_lbs.deleted); >> hmapx_init(&trk_data->trk_nat_lrs); >> + hmapx_init(&trk_data->trk_lrs_routes); >> hmapx_init(&trk_data->ls_with_changed_lbs); >> hmapx_init(&trk_data->ls_with_changed_acls); >> hmapx_init(&trk_data->ls_with_changed_ipam); >> @@ -4558,6 +4560,7 @@ destroy_northd_tracked_data(struct northd_data *nd) >> hmapx_destroy(&trk_data->trk_lbs.crupdated); >> hmapx_destroy(&trk_data->trk_lbs.deleted); >> hmapx_destroy(&trk_data->trk_nat_lrs); >> + hmapx_destroy(&trk_data->trk_lrs_routes); >> hmapx_destroy(&trk_data->ls_with_changed_lbs); >> hmapx_destroy(&trk_data->ls_with_changed_acls); >> hmapx_destroy(&trk_data->ls_with_changed_ipam); >> @@ -5379,7 +5382,8 @@ lr_changes_can_be_handled(const struct >> nbrec_logical_router *lr) >> if (nbrec_logical_router_is_updated(lr, col)) { >> if (col == NBREC_LOGICAL_ROUTER_COL_LOAD_BALANCER >> || col == NBREC_LOGICAL_ROUTER_COL_LOAD_BALANCER_GROUP >> - || col == NBREC_LOGICAL_ROUTER_COL_NAT) { >> + || col == NBREC_LOGICAL_ROUTER_COL_NAT >> + || col == NBREC_LOGICAL_ROUTER_COL_STATIC_ROUTES) { >> continue; >> } >> return false; >> @@ -5404,12 +5408,7 @@ lr_changes_can_be_handled(const struct >> nbrec_logical_router *lr) >> return false; >> } >> } >> - for (size_t i = 0; i < lr->n_static_routes; i++) { >> - if (nbrec_logical_router_static_route_row_get_seqno( >> - lr->static_routes[i], OVSDB_IDL_CHANGE_MODIFY) > 0) { >> - return false; >> - } >> - } >> + >> return true; >> } >> >> @@ -5435,6 +5434,13 @@ is_lr_nats_changed(const struct >> nbrec_logical_router *nbr) { >> || is_lr_nats_seqno_changed(nbr)); >> } >> >> +static bool >> +is_lr_static_routes_changed(const struct nbrec_logical_router *nbr) { >> + return nbrec_logical_router_is_updated(nbr, >> + >> NBREC_LOGICAL_ROUTER_COL_STATIC_ROUTES); >> +} >> + >> + >> /* Return true if changes are handled incrementally, false otherwise. >> * >> * Note: Changes to load balancer and load balancer groups associated >> with >> @@ -5503,6 +5509,22 @@ northd_handle_lr_changes(const struct northd_input >> *ni, >> >> hmapx_add(&nd->trk_data.trk_nat_lrs, od); >> } >> + >> + /* Static Route was added or deleted. */ >> + if (is_lr_static_routes_changed(changed_lr)) { >> + struct ovn_datapath *od = ovn_datapath_find_( >> + &nd->lr_datapaths.datapaths, >> + &changed_lr->header_.uuid); >> + >> + if (!od) { >> + static struct vlog_rate_limit rl = >> VLOG_RATE_LIMIT_INIT(1, 1); >> + VLOG_WARN_RL(&rl, "Internal error: a tracked updated LR " >> + "doesn't exist in lr_datapaths: "UUID_FMT, >> + UUID_ARGS(&changed_lr->header_.uuid)); >> + goto fail; >> + } >> + hmapx_add(&nd->trk_data.trk_lrs_routes, od); >> + } >> } >> >> HMAPX_FOR_EACH (node, &ni->synced_lrs->deleted) { >> @@ -5543,6 +5565,9 @@ northd_handle_lr_changes(const struct northd_input >> *ni, >> if (!hmapx_is_empty(&nd->trk_data.trk_nat_lrs)) { >> nd->trk_data.type |= NORTHD_TRACKED_LR_NATS; >> } >> + if (!hmapx_is_empty(&nd->trk_data.trk_lrs_routes)) { >> + nd->trk_data.type |= NORTHD_TRACKED_LR_ROUTES; >> + } >> if (!hmapx_is_empty(&nd->trk_data.trk_routers.crupdated) || >> !hmapx_is_empty(&nd->trk_data.trk_routers.deleted)) { >> nd->trk_data.type |= NORTHD_TRACKED_ROUTERS; >> @@ -12189,6 +12214,7 @@ parsed_route_init(const struct ovn_datapath *od, >> new_pr->route_table_id = route_table_id; >> new_pr->is_src_route = is_src_route; >> new_pr->od = od; >> + new_pr->is_in_parsed_routes = false; >> new_pr->ecmp_symmetric_reply = ecmp_symmetric_reply; >> new_pr->is_discard_route = is_discard_route; >> new_pr->lrp_addr_s = nullable_xstrdup(lrp_addr_s); >> @@ -12296,6 +12322,7 @@ parsed_route_add(const struct ovn_datapath *od, >> struct parsed_route *pr = parsed_route_lookup(routes, hash, new_pr); >> if (!pr) { >> hmap_insert(routes, &new_pr->key_node, hash); >> + new_pr->is_in_parsed_routes = true; >> return new_pr; >> } else { >> pr->stale = false; >> @@ -12304,7 +12331,7 @@ parsed_route_add(const struct ovn_datapath *od, >> } >> } >> >> -static void >> +struct parsed_route * >> parsed_routes_add_static(const struct ovn_datapath *od, >> const struct hmap *lr_ports, >> const struct nbrec_logical_router_static_route >> *route, >> @@ -12325,8 +12352,9 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> UUID_FMT, route->nexthop, >> UUID_ARGS(&route->header_.uuid)); >> free(nexthop); >> - return; >> + return NULL; >> } >> + >> if ((IN6_IS_ADDR_V4MAPPED(nexthop) && plen != 32) || >> (!IN6_IS_ADDR_V4MAPPED(nexthop) && plen != 128)) { >> static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, >> 1); >> @@ -12334,7 +12362,7 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> UUID_FMT, route->nexthop, >> UUID_ARGS(&route->header_.uuid)); >> free(nexthop); >> - return; >> + return NULL; >> } >> } >> >> @@ -12346,7 +12374,7 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> UUID_FMT, route->ip_prefix, >> UUID_ARGS(&route->header_.uuid)); >> free(nexthop); >> - return; >> + return NULL; >> } >> >> /* Verify that ip_prefix and nexthop are on the same network. */ >> @@ -12358,7 +12386,7 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> : IN6_IS_ADDR_V4MAPPED(&prefix), >> &lrp_addr_s, &out_port)) { >> free(nexthop); >> - return; >> + return NULL; >> } >> >> const struct nbrec_bfd *nb_bt = route->bfd; >> @@ -12368,7 +12396,7 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> nb_bt->dst_ip); >> if (!bfd_e) { >> free(nexthop); >> - return; >> + return NULL; >> } >> >> /* This static route is linked to an active bfd session. */ >> @@ -12385,10 +12413,9 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> bfd_set_status(bfd_sr, "down"); >> } >> >> - >> if (!strcmp(bfd_sr->status, "down")) { >> - free(nexthop); >> - return; >> + free(nexthop); >> + return NULL; >> } >> } >> >> @@ -12427,11 +12454,15 @@ parsed_routes_add_static(const struct >> ovn_datapath *od, >> source = ROUTE_SOURCE_STATIC; >> } >> >> - parsed_route_add(od, nexthop, &prefix, plen, is_discard_route, >> lrp_addr_s, >> - out_port, route_table_id, is_src_route, >> - ecmp_symmetric_reply, &ecmp_selection_fields, >> source, >> - &route->header_, NULL, routes); >> + struct parsed_route *pr = parsed_route_add(od, nexthop, &prefix, >> plen, >> + is_discard_route, >> lrp_addr_s, >> + out_port, route_table_id, >> + is_src_route, >> + ecmp_symmetric_reply, >> + &ecmp_selection_fields, >> source, >> + &route->header_, NULL, >> routes); >> sset_destroy(&ecmp_selection_fields); >> + return pr; >> } >> >> static void >> @@ -16309,13 +16340,14 @@ build_lr_gateway_redirect_flows_for_nats( >> * In the common case where the Ethernet destination has been resolved, >> * this table outputs the packet (priority 0). Otherwise, it composes >> * and sends an ARP/IPv6 NA request (priority 100). */ >> -static void >> +void >> build_arp_request_flows_for_lrouter( >> - struct ovn_datapath *od, struct lflow_table *lflows, >> - struct ds *match, struct ds *actions, >> + const struct ovn_datapath *od, struct lflow_table *lflows, >> const struct shash *meter_groups, >> struct lflow_ref *lflow_ref) >> { >> + struct ds match = DS_EMPTY_INITIALIZER; >> + struct ds actions = DS_EMPTY_INITIALIZER; >> ovs_assert(od->nbr); >> for (int i = 0; i < od->nbr->n_static_routes; i++) { >> const struct nbrec_logical_router_static_route *route; >> @@ -16329,8 +16361,8 @@ build_arp_request_flows_for_lrouter( >> continue; >> } >> >> - ds_clear(match); >> - ds_put_format(match, "eth.dst == 00:00:00:00:00:00 && " >> + ds_clear(&match); >> + ds_put_format(&match, "eth.dst == 00:00:00:00:00:00 && " >> REGBIT_NEXTHOP_IS_IPV4" == 0 && " >> REG_NEXT_HOP_IPV6 " == %s", >> route->nexthop); >> @@ -16342,8 +16374,8 @@ build_arp_request_flows_for_lrouter( >> char sn_addr_s[INET6_ADDRSTRLEN + 1]; >> ipv6_string_mapped(sn_addr_s, &sn_addr); >> >> - ds_clear(actions); >> - ds_put_format(actions, >> + ds_clear(&actions); >> + ds_put_format(&actions, >> "nd_ns { " >> "eth.dst = "ETH_ADDR_FMT"; " >> "ip6.dst = %s; " >> @@ -16353,7 +16385,7 @@ build_arp_request_flows_for_lrouter( >> route->nexthop); >> >> ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 200, >> - ds_cstr(match), ds_cstr(actions), lflow_ref, >> + ds_cstr(&match), ds_cstr(&actions), lflow_ref, >> WITH_CTRL_METER(copp_meter_get(COPP_ND_NS_RESOLVE, >> od->nbr->copp, >> meter_groups)), >> @@ -16385,6 +16417,8 @@ build_arp_request_flows_for_lrouter( >> >> meter_groups))); >> ovn_lflow_add(lflows, od, S_ROUTER_IN_ARP_REQUEST, 0, "1", "next;", >> lflow_ref); >> + ds_destroy(&match); >> + ds_destroy(&actions); >> } >> >> static void >> @@ -19508,8 +19542,7 @@ build_lswitch_and_lrouter_iterate_by_lr(struct >> ovn_datapath *od, >> build_gateway_redirect_flows_for_lrouter(od, lsi->lflows, >> &lsi->match, >> &lsi->actions, >> od->datapath_lflows); >> - build_arp_request_flows_for_lrouter(od, lsi->lflows, &lsi->match, >> - &lsi->actions, >> + build_arp_request_flows_for_lrouter(od, lsi->lflows, >> lsi->meter_groups, >> od->datapath_lflows); >> build_ecmp_stateful_egr_flows_for_lrouter(od, lsi->lflows, >> @@ -21067,6 +21100,9 @@ routes_init(struct routes_data *data) >> hmap_init(&data->parsed_routes); >> simap_init(&data->route_tables); >> hmap_init(&data->bfd_active_connections); >> + data->tracked = false; >> + hmapx_init(&data->trk_data.trk_deleted_parsed_route); >> + hmapx_init(&data->trk_data.trk_crupdated_parsed_route); >> } >> >> void >> @@ -21197,6 +21233,17 @@ routes_destroy(struct routes_data *data) >> >> simap_destroy(&data->route_tables); >> __bfd_destroy(&data->bfd_active_connections); >> + data->tracked = false; >> + hmapx_destroy(&data->trk_data.trk_crupdated_parsed_route); >> + hmapx_destroy(&data->trk_data.trk_deleted_parsed_route); >> +} >> + >> +void >> +routes_clear_tracked(struct routes_data *data) >> +{ >> + data->tracked = false; >> + hmapx_clear(&data->trk_data.trk_crupdated_parsed_route); >> + hmapx_clear(&data->trk_data.trk_deleted_parsed_route); >> } >> >> void >> diff --git a/northd/northd.h b/northd/northd.h >> index a9070d6f6..5b3461840 100644 >> --- a/northd/northd.h >> +++ b/northd/northd.h >> @@ -160,6 +160,7 @@ enum northd_tracked_data_type { >> NORTHD_TRACKED_LS_ACLS = (1 << 4), >> NORTHD_TRACKED_SWITCHES = (1 << 5), >> NORTHD_TRACKED_ROUTERS = (1 << 6), >> + NORTHD_TRACKED_LR_ROUTES = (1 << 7), >> }; >> >> /* Track what's changed in the northd engine node. >> @@ -177,6 +178,10 @@ struct northd_tracked_data { >> * hmapx node is 'struct ovn_datapath *'. */ >> struct hmapx trk_nat_lrs; >> >> + /* Tracked logical routers whose static routes have changed. >> + * hmapx node is 'struct ovn_datapath *'. */ >> + struct hmapx trk_lrs_routes; >> + >> /* Tracked logical switches whose load balancers have changed. >> * hmapx node is 'struct ovn_datapath *'. */ >> struct hmapx ls_with_changed_lbs; >> @@ -217,10 +222,23 @@ struct route_policy { >> uint32_t jump_chain_id; >> }; >> >> +struct route_tracked_data { >> + /* Contains references to group_ecmp_route_node. Each of the >> referenced >> + * datapaths contains at least one route. */ >> + struct hmapx trk_crupdated_parsed_route; >> + >> + /* Contains references to group_ecmp_route_node. Each of the >> referenced >> + * datapath previously had some routes. The datapath now no longer >> + * contains any route.*/ >> + struct hmapx trk_deleted_parsed_route; >> +}; >> + >> struct routes_data { >> struct hmap parsed_routes; /* Stores struct parsed_route. */ >> struct simap route_tables; >> struct hmap bfd_active_connections; >> + bool tracked; >> + struct route_tracked_data trk_data; >> }; >> >> struct route_policies_data { >> @@ -855,6 +873,7 @@ struct parsed_route { >> char *lrp_addr_s; >> const struct ovn_port *out_port; >> const struct ovn_port *tracked_port; /* May be NULL. */ >> + bool is_in_parsed_routes; >> }; >> >> struct parsed_route *parsed_route_clone(const struct parsed_route *); >> @@ -881,6 +900,14 @@ struct parsed_route *parsed_route_add( >> const struct ovn_port *tracked_port, >> struct hmap *routes); >> >> +struct parsed_route * parsed_routes_add_static( >> + const struct ovn_datapath *od, >> + const struct hmap *lr_ports, >> + const struct nbrec_logical_router_static_route *route, >> + const struct hmap *bfd_connections, >> + struct hmap *routes, struct simap *route_tables, >> + struct hmap *bfd_active_connections); >> + >> struct svc_monitors_map_data { >> const struct hmap *local_svc_monitors_map; >> const struct hmap *ic_learned_svc_monitors_map; >> @@ -925,7 +952,7 @@ void build_parsed_routes(const struct ovn_datapath *, >> const struct hmap *, >> uint32_t get_route_table_id(struct simap *, const char *); >> void routes_init(struct routes_data *); >> void routes_destroy(struct routes_data *); >> - >> +void routes_clear_tracked(struct routes_data *); >> void bfd_init(struct bfd_data *); >> void bfd_destroy(struct bfd_data *); >> >> @@ -951,6 +978,10 @@ void build_route_data_flows_for_lrouter( >> const struct ovn_datapath *od, struct lflow_table *lflows, >> const struct group_ecmp_datapath *route_node, >> const struct sset *bfd_ports); >> +void build_arp_request_flows_for_lrouter( >> + const struct ovn_datapath *od, struct lflow_table *lflows, >> + const struct shash *meter_groups, >> + struct lflow_ref *lflow_ref); >> >> bool lflow_handle_northd_lr_changes(struct ovsdb_idl_txn *ovnsh_txn, >> struct tracked_dps *, >> @@ -1041,6 +1072,11 @@ northd_has_lr_nats_in_tracked_data(struct >> northd_tracked_data *trk_nd_changes) >> { >> return trk_nd_changes->type & NORTHD_TRACKED_LR_NATS; >> } >> +static inline bool >> +northd_has_lr_route_in_tracked_data(struct northd_tracked_data >> *trk_nd_changes) >> +{ >> + return trk_nd_changes->type & NORTHD_TRACKED_LR_ROUTES; >> +} >> >> static inline bool >> northd_has_ls_lbs_in_tracked_data(struct northd_tracked_data >> *trk_nd_changes) >> diff --git a/tests/ovn-inc-proc-graph-dump.at b/tests/ >> ovn-inc-proc-graph-dump.at >> index 178310978..fd05c20dc 100644 >> --- a/tests/ovn-inc-proc-graph-dump.at >> +++ b/tests/ovn-inc-proc-graph-dump.at >> @@ -151,9 +151,11 @@ digraph "Incremental-Processing-Engine" { >> bfd [[style=filled, shape=box, fillcolor=white, label="bfd"]]; >> NB_bfd -> bfd [[label=""]]; >> SB_bfd -> bfd [[label=""]]; >> + NB_logical_router_static_route [[style=filled, shape=box, >> fillcolor=white, label="NB_logical_router_static_route"]]; >> routes [[style=filled, shape=box, fillcolor=white, >> label="routes"]]; >> bfd -> routes [[label=""]]; >> northd -> routes [[label="routes_northd_change_handler"]]; >> + NB_logical_router_static_route -> routes >> [[label="routes_static_route_change_handler"]]; >> route_policies [[style=filled, shape=box, fillcolor=white, >> label="route_policies"]]; >> bfd -> route_policies [[label=""]]; >> northd -> route_policies >> [[label="route_policies_northd_change_handler"]]; >> @@ -168,7 +170,7 @@ digraph "Incremental-Processing-Engine" { >> SB_learned_route -> learned_route_sync >> [[label="learned_route_sync_sb_learned_route_change_handler"]]; >> northd -> learned_route_sync >> [[label="learned_route_sync_northd_change_handler"]]; >> group_ecmp_route [[style=filled, shape=box, fillcolor=white, >> label="group_ecmp_route"]]; >> - routes -> group_ecmp_route [[label=""]]; >> + routes -> group_ecmp_route >> [[label="group_ecmp_static_route_change_handler"]]; >> learned_route_sync -> group_ecmp_route >> [[label="group_ecmp_route_learned_route_change_handler"]]; >> ls_stateful [[style=filled, shape=box, fillcolor=white, >> label="ls_stateful"]]; >> northd -> ls_stateful [[label="ls_stateful_northd_handler"]]; >> @@ -189,7 +191,7 @@ digraph "Incremental-Processing-Engine" { >> SB_logical_dp_group -> lflow [[label=""]]; >> bfd_sync -> lflow [[label=""]]; >> route_policies -> lflow [[label=""]]; >> - routes -> lflow [[label=""]]; >> + routes -> lflow [[label="lflow_group_route_change_handler"]]; >> group_ecmp_route -> lflow >> [[label="lflow_group_ecmp_route_change_handler"]]; >> global_config -> lflow [[label="node_global_config_handler"]]; >> sampling_app -> lflow [[label=""]]; >> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at >> index 1d7bd6c28..eacccaf20 100644 >> --- a/tests/ovn-northd.at >> +++ b/tests/ovn-northd.at >> @@ -4272,9 +4272,9 @@ check ovn-nbctl --bfd=$uuid lr-route-add r0 >> 100.0.0.0/8 192.168.1.2 >> wait_column down bfd status logical_port=r0-sw1 >> AT_CHECK([ovn-nbctl lr-route-list r0 | grep 192.168.1.2 | grep -q bfd], >> [0], [], [ignore]) >> >> -check_engine_stats northd recompute nocompute >> +check_engine_stats northd norecompute compute >> check_engine_stats bfd recompute nocompute >> -check_engine_stats routes recompute nocompute >> +check_engine_stats routes recompute incremental >> check_engine_stats lflow recompute nocompute >> check_engine_stats northd_output norecompute compute >> CHECK_NO_CHANGE_AFTER_RECOMPUTE >> @@ -4288,9 +4288,9 @@ check ovn-nbctl --bfd lr-route-add r0 240.0.0.0/8 >> 192.168.5.2 r0-sw5 >> wait_column down bfd status logical_port=r0-sw5 >> AT_CHECK([ovn-nbctl lr-route-list r0 | grep 192.168.5.2 | grep -q bfd], >> [0], [], [ignore]) >> >> -check_engine_stats northd recompute nocompute >> +check_engine_stats northd norecompute compute >> check_engine_stats bfd recompute nocompute >> -check_engine_stats routes recompute nocompute >> +check_engine_stats routes recompute incremental >> check_engine_stats lflow recompute nocompute >> check_engine_stats northd_output norecompute compute >> CHECK_NO_CHANGE_AFTER_RECOMPUTE >> @@ -4300,7 +4300,7 @@ check ovn-nbctl --bfd --policy=src-ip lr-route-add >> r0 192.168.6.1/32 192.168.10. >> wait_column down bfd status logical_port=r0-sw6 >> AT_CHECK([ovn-nbctl lr-route-list r0 | grep 192.168.6.1 | grep -q bfd], >> [0], [], [ignore]) >> >> -check_engine_stats northd recompute nocompute >> +check_engine_stats northd norecompute compute >> check_engine_stats bfd recompute nocompute >> check_engine_stats route_policies recompute nocompute >> check_engine_stats lflow recompute nocompute >> @@ -4335,10 +4335,10 @@ wait_column down bfd status logical_port=r0-sw8 >> bfd_route_policy_uuid=$(fetch_column nb:bfd _uuid logical_port=r0-sw8) >> AT_CHECK([ovn-nbctl list logical_router_policy | grep -q >> $bfd_route_policy_uuid]) >> >> -check_engine_stats northd recompute nocompute >> +check_engine_stats northd recompute incremental >> check_engine_stats bfd recompute nocompute >> -check_engine_stats routes recompute nocompute >> -check_engine_stats lflow recompute nocompute >> +check_engine_stats routes recompute incremental >> +check_engine_stats lflow recompute incremental >> check_engine_stats northd_output norecompute compute >> CHECK_NO_CHANGE_AFTER_RECOMPUTE >> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> @@ -16437,12 +16437,12 @@ CHECK_NO_CHANGE_AFTER_RECOMPUTE >> >> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> check ovn-nbctl --wait=sb lr-route-add lr0 192.168.0.0/24 10.0.0.10 >> -check_engine_compute northd recompute >> -check_engine_compute routes recompute >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> check_engine_compute advertised_route_sync recompute >> -check_engine_compute learned_route_sync recompute >> -check_engine_compute group_ecmp_route recompute >> -check_engine_compute lflow recompute >> +check_engine_compute learned_route_sync incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> CHECK_NO_CHANGE_AFTER_RECOMPUTE >> >> check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> @@ -20672,3 +20672,75 @@ check_column "$global_svc_mon_mac" >> sb:Service_Monitor src_mac port=2 >> OVN_CLEANUP_NORTHD >> AT_CLEANUP >> ]) >> + >> +OVN_FOR_EACH_NORTHD_NO_HV([ >> +AT_SETUP([Static Route incremental processing]) >> +ovn_start >> + >> +check ovn-nbctl lr-add r0 >> + >> +check ovn-nbctl --wait=sb lrp-add r0 r0-lrp1 00:00:00:00:00:01 >> 192.168.1.1/24 >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb lr-route-add r0 10.0.0.0/24 192.168.1.2 >> + >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +static_route_uuid=`ovn-nbctl --bare --columns _uuid find >> Logical_Router_Static_Route nexthop=192.168.1.2` >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb set logical_router_static_route >> $static_route_uuid nexthop=192.168.1.3 >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb set logical_router_static_route >> $static_route_uuid ip_prefix=10.0.1.0/24 >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +check ovn-nbctl --wait=sb lrp-add r0 r0-lrp2 00:00:00:00:00:02 >> 192.168.1.10/24 >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb set logical_router_static_route >> $static_route_uuid output_port=r0-lrp2 >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb set logical_router_static_route >> $static_route_uuid policy=src-ip >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb set logical_router_static_route >> $static_route_uuid selection_fields="ip_proto,ip_src,ip_dst" >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl --wait=sb set logical_router_static_route >> $static_route_uuid options:ecmp_symmetric_reply=true >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats >> +check ovn-nbctl remove logical_router r0 static_routes $static_route_uuid >> +check_engine_compute northd incremental >> +check_engine_compute routes incremental >> +check_engine_compute group_ecmp_route incremental >> +check_engine_compute lflow incremental >> + >> +OVN_CLEANUP_NORTHD >> +AT_CLEANUP >> +]) >> -- >> 2.43.0 >> >> -- _‘Esta mensagem é direcionada apenas para os endereços constantes no cabeçalho inicial. Se você não está listado nos endereços constantes no cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas estão imediatamente anuladas e proibidas’._ * **‘Apesar do Magazine Luiza tomar todas as precauções razoáveis para assegurar que nenhum vírus esteja presente nesse e-mail, a empresa não poderá aceitar a responsabilidade por quaisquer perdas ou danos causados por esse e-mail ou por seus anexos’.* _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
