The northd and en-lb-data nodes were the only ones that attempted to interact with the northbound logical switch and logical router tables.
This commit changes them to use synced datapaths instead. Any new engine nodes that are added should also consume synced datapaths instead of northbound logical datapaths. Essentially, synced datapaths are a proxy structure for northbound logical routers, northbound logical switches, and southbound datapath bindings. One side effect of this change is that the load balancer incremental processing test is updated. The reason is that when using synced datapaths, disabled logical routers essentially do not exist to any consumers of synced datapaths. When the test added a disabled logical router, it used to cause en-northd to recompute. But now, en-northd is not made aware of the existence of the disabled logical router, so en-northd does not recompute in this circumstance. Signed-off-by: Mark Michelson <mmich...@redhat.com> Acked-by: Ales Musil <amu...@redhat.com> --- v16 * No changes, other than what was mentioned in patch 6's notes. v15 * Rebased. v14 * Rebased. * In this version, we have changed synced datapaths and ovn_datapath to use ovn_synced_datapaths instead of direct pointers to the sbrec_datapath_binding. v13 * Rebased. v12 * Rebased. * Used a designated initializer when allocating a struct crupdated_od_lb_data. * en_northd no longer has sb_datapath_binding as an input. This originally was in patch 6 of the series, but that caused test failures. Having it here makes tests pass properly. * Added Ales Musil's ack. --- northd/aging.c | 8 +- northd/en-advertised-route-sync.c | 12 +- northd/en-lb-data.c | 267 ++++++++++++++++++------------ northd/en-lb-data.h | 4 +- northd/en-multicast.c | 4 +- northd/en-northd.c | 4 - northd/en-port-group.c | 3 +- northd/inc-proc-northd.c | 27 ++- northd/lflow-mgr.c | 4 +- northd/northd.c | 82 ++++----- northd/northd.h | 4 +- tests/ovn-northd.at | 2 +- 12 files changed, 239 insertions(+), 182 deletions(-) diff --git a/northd/aging.c b/northd/aging.c index aa62a90dc..62e25f6cb 100644 --- a/northd/aging.c +++ b/northd/aging.c @@ -412,7 +412,7 @@ en_mac_binding_aging_run(struct engine_node *node, void *data OVS_UNUSED) HMAP_FOR_EACH (od, key_node, &northd_data->lr_datapaths.datapaths) { ovs_assert(od->nbr); - if (!od->sb) { + if (!od->sdp->sb_dp) { continue; } @@ -425,7 +425,7 @@ en_mac_binding_aging_run(struct engine_node *node, void *data OVS_UNUSED) aging_context_set_threshold(&ctx, &threshold_config); - mac_binding_aging_run_for_datapath(od->sb, + mac_binding_aging_run_for_datapath(od->sdp->sb_dp, sbrec_mac_binding_by_datapath, &ctx); threshold_config_destroy(&threshold_config); @@ -544,7 +544,7 @@ en_fdb_aging_run(struct engine_node *node, void *data OVS_UNUSED) HMAP_FOR_EACH (od, key_node, &northd_data->ls_datapaths.datapaths) { ovs_assert(od->nbs); - if (!od->sb) { + if (!od->sdp->sb_dp) { continue; } @@ -553,7 +553,7 @@ en_fdb_aging_run(struct engine_node *node, void *data OVS_UNUSED) threshold_config.default_threshold = smap_get_uint(&od->nbs->other_config, "fdb_age_threshold", 0); aging_context_set_threshold(&ctx, &threshold_config); - fdb_run_for_datapath(od->sb, sbrec_fdb_by_dp_key, &ctx); + fdb_run_for_datapath(od->sdp->sb_dp, sbrec_fdb_by_dp_key, &ctx); if (aging_context_is_at_limit(&ctx)) { /* Schedule the next run after specified delay. */ diff --git a/northd/en-advertised-route-sync.c b/northd/en-advertised-route-sync.c index e75ab15c5..dfa9f9c44 100644 --- a/northd/en-advertised-route-sync.c +++ b/northd/en-advertised-route-sync.c @@ -56,7 +56,7 @@ ar_entry_add_nocopy(struct hmap *routes, const struct ovn_datapath *od, route_e->ip_prefix = ip_prefix; route_e->tracked_port = tracked_port; route_e->source = source; - uint32_t hash = uuid_hash(&od->sb->header_.uuid); + uint32_t hash = uuid_hash(&od->sdp->sb_dp->header_.uuid); hash = hash_string(op->sb->logical_port, hash); hash = hash_string(ip_prefix, hash); hmap_insert(routes, &route_e->hmap_node, hash); @@ -92,7 +92,7 @@ ar_entry_find(struct hmap *route_map, HMAP_FOR_EACH_WITH_HASH (route_e, hmap_node, hash, route_map) { if (!uuid_equals(&sb_db->header_.uuid, - &route_e->od->sb->header_.uuid)) { + &route_e->od->sdp->sb_dp->header_.uuid)) { continue; } if (!uuid_equals(&logical_port->header_.uuid, @@ -281,7 +281,8 @@ build_nat_route_for_port(const struct ovn_port *advertising_op, ? ovn_port_find(ls_ports, nat->nb->logical_port) : nat->l3dgw_port; - if (!ar_entry_find(routes, advertising_od->sb, advertising_op->sb, + if (!ar_entry_find(routes, advertising_od->sdp->sb_dp, + advertising_op->sb, nat->nb->external_ip, tracked_port ? tracked_port->sb : NULL)) { ar_entry_add(routes, advertising_od, advertising_op, @@ -767,7 +768,8 @@ advertised_route_table_sync( const struct sbrec_port_binding *tracked_pb = route_e->tracked_port ? route_e->tracked_port->sb : NULL; - if (ar_entry_find(&sync_routes, route_e->od->sb, route_e->op->sb, + if (ar_entry_find(&sync_routes, route_e->od->sdp->sb_dp, + route_e->op->sb, route_e->ip_prefix, tracked_pb)) { /* We could already have advertised route entry for LRP IP that * corresponds to "snat" when "connected-as-host" is combined @@ -802,7 +804,7 @@ advertised_route_table_sync( HMAP_FOR_EACH_POP (route_e, hmap_node, &sync_routes) { const struct sbrec_advertised_route *sr = sbrec_advertised_route_insert(ovnsb_txn); - sbrec_advertised_route_set_datapath(sr, route_e->od->sb); + sbrec_advertised_route_set_datapath(sr, route_e->od->sdp->sb_dp); sbrec_advertised_route_set_logical_port(sr, route_e->op->sb); sbrec_advertised_route_set_ip_prefix(sr, route_e->ip_prefix); if (route_e->tracked_port) { diff --git a/northd/en-lb-data.c b/northd/en-lb-data.c index 3b19d9ac9..6d52d465e 100644 --- a/northd/en-lb-data.c +++ b/northd/en-lb-data.c @@ -32,6 +32,8 @@ #include "lib/ovn-sb-idl.h" #include "lib/ovn-util.h" #include "northd.h" +#include "en-datapath-logical-switch.h" +#include "en-datapath-logical-router.h" VLOG_DEFINE_THIS_MODULE(en_lb_data); @@ -40,8 +42,8 @@ static void lb_data_destroy(struct ed_type_lb_data *); static void build_lbs(const struct nbrec_load_balancer_table *, const struct nbrec_load_balancer_group_table *, struct hmap *lbs, struct hmap *lb_groups); -static void build_od_lb_map(const struct nbrec_logical_switch_table *, - const struct nbrec_logical_router_table *, +static void build_od_lb_map(const struct ovn_synced_logical_switch_map *, + const struct ovn_synced_logical_router_map *, struct hmap *ls_lb_map, struct hmap *lr_lb_map); static struct od_lb_data *find_od_lb_data(struct hmap *od_lb_map, const struct uuid *od_uuid); @@ -73,10 +75,14 @@ static struct crupdated_lbgrp * struct tracked_lb_data *); static void add_deleted_lbgrp_to_tracked_data( struct ovn_lb_group *, struct tracked_lb_data *); -static bool is_ls_lbs_changed(const struct nbrec_logical_switch *nbs); -static bool is_ls_lbgrps_changed(const struct nbrec_logical_switch *nbs); -static bool is_lr_lbs_changed(const struct nbrec_logical_router *); -static bool is_lr_lbgrps_changed(const struct nbrec_logical_router *); +static bool is_ls_lbs_changed(const struct nbrec_logical_switch *nbs, + bool is_new); +static bool is_ls_lbgrps_changed(const struct nbrec_logical_switch *nbs, + bool is_new); +static bool is_lr_lbs_changed(const struct nbrec_logical_router *, + bool is_new); +static bool is_lr_lbgrps_changed(const struct nbrec_logical_router *, + bool is_new); /* 'lb_data' engine node manages the NB load balancers and load balancer * groups. For each NB LB, it creates 'struct ovn_northd_lb' and @@ -103,14 +109,14 @@ en_lb_data_run(struct engine_node *node, void *data) EN_OVSDB_GET(engine_get_input("NB_load_balancer", node)); const struct nbrec_load_balancer_group_table *nb_lbg_table = EN_OVSDB_GET(engine_get_input("NB_load_balancer_group", node)); - const struct nbrec_logical_switch_table *nb_ls_table = - EN_OVSDB_GET(engine_get_input("NB_logical_switch", node)); - const struct nbrec_logical_router_table *nb_lr_table = - EN_OVSDB_GET(engine_get_input("NB_logical_router", node)); + const struct ovn_synced_logical_switch_map *synced_lses = + engine_get_input_data("datapath_synced_logical_switch", node); + const struct ovn_synced_logical_router_map *synced_lrs = + engine_get_input_data("datapath_synced_logical_router", node); lb_data->tracked = false; build_lbs(nb_lb_table, nb_lbg_table, &lb_data->lbs, &lb_data->lbgrps); - build_od_lb_map(nb_ls_table, nb_lr_table, &lb_data->ls_lb_map, + build_od_lb_map(synced_lses, synced_lrs, &lb_data->ls_lb_map, &lb_data->lr_lb_map); return EN_UPDATED; @@ -320,115 +326,162 @@ lb_data_load_balancer_group_handler(struct engine_node *node, void *data) return EN_HANDLED_UPDATED; } +static bool +lb_data_handle_updated_logical_switch(const struct nbrec_logical_switch *nbs, + struct ed_type_lb_data *lb_data, + struct tracked_lb_data *trk_lb_data, + bool is_new) +{ + bool ls_lbs_changed = is_ls_lbs_changed(nbs, is_new); + bool ls_lbgrps_changed = is_ls_lbgrps_changed(nbs, is_new); + if (!ls_lbs_changed && !ls_lbgrps_changed) { + return false; + } + struct crupdated_od_lb_data *codlb = xmalloc(sizeof *codlb); + *codlb = (struct crupdated_od_lb_data) { + .od_uuid = nbs->header_.uuid, + .assoc_lbs = UUIDSET_INITIALIZER(&codlb->assoc_lbs), + .assoc_lbgrps = UUIDSET_INITIALIZER(&codlb->assoc_lbgrps), + }; + + struct od_lb_data *od_lb_data = + find_od_lb_data(&lb_data->ls_lb_map, &nbs->header_.uuid); + if (!od_lb_data) { + od_lb_data = create_od_lb_data(&lb_data->ls_lb_map, + &nbs->header_.uuid); + } + + if (ls_lbs_changed) { + handle_od_lb_changes(nbs->load_balancer, nbs->n_load_balancer, + od_lb_data, lb_data, codlb); + } + + if (ls_lbgrps_changed) { + handle_od_lbgrp_changes(nbs->load_balancer_group, + nbs->n_load_balancer_group, + od_lb_data, lb_data, codlb); + } + + ovs_list_insert(&trk_lb_data->crupdated_ls_lbs, &codlb->list_node); + return true; +} + enum engine_input_handler_result -lb_data_logical_switch_handler(struct engine_node *node, void *data) +lb_data_synced_logical_switch_handler(struct engine_node *node, void *data) { struct ed_type_lb_data *lb_data = (struct ed_type_lb_data *) data; - const struct nbrec_logical_switch_table *nb_ls_table = - EN_OVSDB_GET(engine_get_input("NB_logical_switch", node)); + const struct ovn_synced_logical_switch_map *synced_lses = + engine_get_input_data("datapath_synced_logical_switch", node); struct tracked_lb_data *trk_lb_data = &lb_data->tracked_lb_data; lb_data->tracked = true; bool changed = false; const struct nbrec_logical_switch *nbs; - NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH_TRACKED (nbs, nb_ls_table) { - if (nbrec_logical_switch_is_deleted(nbs)) { - struct od_lb_data *od_lb_data = - find_od_lb_data(&lb_data->ls_lb_map, &nbs->header_.uuid); - if (od_lb_data) { - hmap_remove(&lb_data->ls_lb_map, &od_lb_data->hmap_node); - hmapx_add(&trk_lb_data->deleted_od_lb_data, od_lb_data); - } - } else { - bool ls_lbs_changed = is_ls_lbs_changed(nbs); - bool ls_lbgrps_changed = is_ls_lbgrps_changed(nbs); - if (!ls_lbs_changed && !ls_lbgrps_changed) { - continue; - } - changed = true; - struct crupdated_od_lb_data *codlb = xzalloc(sizeof *codlb); - codlb->od_uuid = nbs->header_.uuid; - uuidset_init(&codlb->assoc_lbs); - uuidset_init(&codlb->assoc_lbgrps); - - struct od_lb_data *od_lb_data = - find_od_lb_data(&lb_data->ls_lb_map, &nbs->header_.uuid); - if (!od_lb_data) { - od_lb_data = create_od_lb_data(&lb_data->ls_lb_map, - &nbs->header_.uuid); - } - - if (ls_lbs_changed) { - handle_od_lb_changes(nbs->load_balancer, nbs->n_load_balancer, - od_lb_data, lb_data, codlb); - } + struct hmapx_node *h_node; + HMAPX_FOR_EACH (h_node, &synced_lses->deleted) { + struct ovn_synced_logical_switch *synced = h_node->data; + nbs = synced->nb; + struct od_lb_data *od_lb_data = + find_od_lb_data(&lb_data->ls_lb_map, &nbs->header_.uuid); + if (od_lb_data) { + hmap_remove(&lb_data->ls_lb_map, &od_lb_data->hmap_node); + hmapx_add(&trk_lb_data->deleted_od_lb_data, od_lb_data); + } + } - if (ls_lbgrps_changed) { - handle_od_lbgrp_changes(nbs->load_balancer_group, - nbs->n_load_balancer_group, - od_lb_data, lb_data, codlb); - } + HMAPX_FOR_EACH (h_node, &synced_lses->new) { + struct ovn_synced_logical_switch *synced = h_node->data; + nbs = synced->nb; + changed |= lb_data_handle_updated_logical_switch(nbs, lb_data, + trk_lb_data, true); + } - ovs_list_insert(&trk_lb_data->crupdated_ls_lbs, &codlb->list_node); - } + HMAPX_FOR_EACH (h_node, &synced_lses->updated) { + struct ovn_synced_logical_switch *synced = h_node->data; + nbs = synced->nb; + changed |= lb_data_handle_updated_logical_switch(nbs, lb_data, + trk_lb_data, false); } return changed ? EN_HANDLED_UPDATED : EN_HANDLED_UNCHANGED; } +static bool +lb_data_handle_updated_logical_router(const struct nbrec_logical_router *nbr, + struct ed_type_lb_data *lb_data, + struct tracked_lb_data *trk_lb_data, + bool is_new) +{ + bool lr_lbs_changed = is_lr_lbs_changed(nbr, is_new); + bool lr_lbgrps_changed = is_lr_lbgrps_changed(nbr, is_new); + if (!lr_lbs_changed && !lr_lbgrps_changed) { + return false; + } + struct crupdated_od_lb_data *codlb = xzalloc(sizeof *codlb); + codlb->od_uuid = nbr->header_.uuid; + uuidset_init(&codlb->assoc_lbs); + uuidset_init(&codlb->assoc_lbgrps); + + struct od_lb_data *od_lb_data = + find_od_lb_data(&lb_data->lr_lb_map, &nbr->header_.uuid); + if (!od_lb_data) { + od_lb_data = create_od_lb_data(&lb_data->lr_lb_map, + &nbr->header_.uuid); + } + + if (lr_lbs_changed) { + handle_od_lb_changes(nbr->load_balancer, nbr->n_load_balancer, + od_lb_data, lb_data, codlb); + } + + if (lr_lbgrps_changed) { + handle_od_lbgrp_changes(nbr->load_balancer_group, + nbr->n_load_balancer_group, + od_lb_data, lb_data, codlb); + } + + ovs_list_insert(&trk_lb_data->crupdated_lr_lbs, &codlb->list_node); + return true; +} + enum engine_input_handler_result -lb_data_logical_router_handler(struct engine_node *node, void *data) +lb_data_synced_logical_router_handler(struct engine_node *node, void *data) { struct ed_type_lb_data *lb_data = (struct ed_type_lb_data *) data; - const struct nbrec_logical_router_table *nbrec_lr_table = - EN_OVSDB_GET(engine_get_input("NB_logical_router", node)); + const struct ovn_synced_logical_router_map *synced_lrs = + engine_get_input_data("datapath_synced_logical_router", node); struct tracked_lb_data *trk_lb_data = &lb_data->tracked_lb_data; lb_data->tracked = true; bool changed = false; const struct nbrec_logical_router *nbr; - NBREC_LOGICAL_ROUTER_TABLE_FOR_EACH_TRACKED (nbr, nbrec_lr_table) { - if (nbrec_logical_router_is_deleted(nbr)) { - struct od_lb_data *od_lb_data = - find_od_lb_data(&lb_data->lr_lb_map, &nbr->header_.uuid); - if (od_lb_data) { - hmap_remove(&lb_data->lr_lb_map, &od_lb_data->hmap_node); - hmapx_add(&trk_lb_data->deleted_od_lb_data, od_lb_data); - } - } else { - bool lr_lbs_changed = is_lr_lbs_changed(nbr); - bool lr_lbgrps_changed = is_lr_lbgrps_changed(nbr); - if (!lr_lbs_changed && !lr_lbgrps_changed) { - continue; - } - changed = true; - struct crupdated_od_lb_data *codlb = xzalloc(sizeof *codlb); - codlb->od_uuid = nbr->header_.uuid; - uuidset_init(&codlb->assoc_lbs); - uuidset_init(&codlb->assoc_lbgrps); - - struct od_lb_data *od_lb_data = - find_od_lb_data(&lb_data->lr_lb_map, &nbr->header_.uuid); - if (!od_lb_data) { - od_lb_data = create_od_lb_data(&lb_data->lr_lb_map, - &nbr->header_.uuid); - } - - if (lr_lbs_changed) { - handle_od_lb_changes(nbr->load_balancer, nbr->n_load_balancer, - od_lb_data, lb_data, codlb); - } + struct hmapx_node *h_node; + + HMAPX_FOR_EACH (h_node, &synced_lrs->deleted) { + struct ovn_synced_logical_router *synced = h_node->data; + nbr = synced->nb; + struct od_lb_data *od_lb_data = + find_od_lb_data(&lb_data->lr_lb_map, &nbr->header_.uuid); + if (od_lb_data) { + hmap_remove(&lb_data->lr_lb_map, &od_lb_data->hmap_node); + hmapx_add(&trk_lb_data->deleted_od_lb_data, od_lb_data); + } + } - if (lr_lbgrps_changed) { - handle_od_lbgrp_changes(nbr->load_balancer_group, - nbr->n_load_balancer_group, - od_lb_data, lb_data, codlb); - } + HMAPX_FOR_EACH (h_node, &synced_lrs->new) { + struct ovn_synced_logical_router *synced = h_node->data; + nbr = synced->nb; + changed |= lb_data_handle_updated_logical_router(nbr, lb_data, + trk_lb_data, true); + } - ovs_list_insert(&trk_lb_data->crupdated_lr_lbs, &codlb->list_node); - } + HMAPX_FOR_EACH (h_node, &synced_lrs->updated) { + struct ovn_synced_logical_router *synced = h_node->data; + nbr = synced->nb; + changed |= lb_data_handle_updated_logical_router(nbr, lb_data, + trk_lb_data, false); } return changed ? EN_HANDLED_UPDATED : EN_HANDLED_UNCHANGED; @@ -523,12 +576,14 @@ create_lb_group(const struct nbrec_load_balancer_group *nbrec_lb_group, } static void -build_od_lb_map(const struct nbrec_logical_switch_table *nbrec_ls_table, - const struct nbrec_logical_router_table *nbrec_lr_table, +build_od_lb_map(const struct ovn_synced_logical_switch_map *synced_lses, + const struct ovn_synced_logical_router_map *synced_lrs, struct hmap *ls_lb_map, struct hmap *lr_lb_map) { const struct nbrec_logical_switch *nbrec_ls; - NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH (nbrec_ls, nbrec_ls_table) { + const struct ovn_synced_logical_switch *synced_ls; + HMAP_FOR_EACH (synced_ls, hmap_node, &synced_lses->synced_switches) { + nbrec_ls = synced_ls->nb; if (!nbrec_ls->n_load_balancer && !nbrec_ls->n_load_balancer_group) { continue; } @@ -546,7 +601,9 @@ build_od_lb_map(const struct nbrec_logical_switch_table *nbrec_ls_table, } const struct nbrec_logical_router *nbrec_lr; - NBREC_LOGICAL_ROUTER_TABLE_FOR_EACH (nbrec_lr, nbrec_lr_table) { + const struct ovn_synced_logical_router *synced_lr; + HMAP_FOR_EACH (synced_lr, hmap_node, &synced_lrs->synced_routers) { + nbrec_lr = synced_lr->nb; if (!nbrec_lr->n_load_balancer && !nbrec_lr->n_load_balancer_group) { continue; } @@ -793,29 +850,29 @@ add_deleted_lbgrp_to_tracked_data(struct ovn_lb_group *lbg, } static bool -is_ls_lbs_changed(const struct nbrec_logical_switch *nbs) { - return ((nbrec_logical_switch_is_new(nbs) && nbs->n_load_balancer) +is_ls_lbs_changed(const struct nbrec_logical_switch *nbs, bool is_new) { + return ((is_new && nbs->n_load_balancer) || nbrec_logical_switch_is_updated(nbs, NBREC_LOGICAL_SWITCH_COL_LOAD_BALANCER)); } static bool -is_ls_lbgrps_changed(const struct nbrec_logical_switch *nbs) { - return ((nbrec_logical_switch_is_new(nbs) && nbs->n_load_balancer_group) +is_ls_lbgrps_changed(const struct nbrec_logical_switch *nbs, bool is_new) { + return ((is_new && nbs->n_load_balancer_group) || nbrec_logical_switch_is_updated(nbs, NBREC_LOGICAL_SWITCH_COL_LOAD_BALANCER_GROUP)); } static bool -is_lr_lbs_changed(const struct nbrec_logical_router *nbr) { - return ((nbrec_logical_router_is_new(nbr) && nbr->n_load_balancer) +is_lr_lbs_changed(const struct nbrec_logical_router *nbr, bool is_new) { + return ((is_new && nbr->n_load_balancer) || nbrec_logical_router_is_updated(nbr, NBREC_LOGICAL_ROUTER_COL_LOAD_BALANCER)); } static bool -is_lr_lbgrps_changed(const struct nbrec_logical_router *nbr) { - return ((nbrec_logical_router_is_new(nbr) && nbr->n_load_balancer_group) +is_lr_lbgrps_changed(const struct nbrec_logical_router *nbr, bool is_new) { + return ((is_new && nbr->n_load_balancer_group) || nbrec_logical_router_is_updated(nbr, NBREC_LOGICAL_ROUTER_COL_LOAD_BALANCER_GROUP)); } diff --git a/northd/en-lb-data.h b/northd/en-lb-data.h index 583b3e412..1da087656 100644 --- a/northd/en-lb-data.h +++ b/northd/en-lb-data.h @@ -119,8 +119,8 @@ lb_data_load_balancer_handler(struct engine_node *, void *data); enum engine_input_handler_result lb_data_load_balancer_group_handler(struct engine_node *, void *data); enum engine_input_handler_result -lb_data_logical_switch_handler(struct engine_node *, void *data); +lb_data_synced_logical_switch_handler(struct engine_node *, void *data); enum engine_input_handler_result -lb_data_logical_router_handler(struct engine_node *, void *data); +lb_data_synced_logical_router_handler(struct engine_node *, void *data); #endif /* end of EN_NORTHD_LB_DATA_H */ diff --git a/northd/en-multicast.c b/northd/en-multicast.c index d51db557e..6613bdaa9 100644 --- a/northd/en-multicast.c +++ b/northd/en-multicast.c @@ -434,7 +434,7 @@ sync_multicast_groups_to_sb( continue; } - sbmc = create_sb_multicast_group(ovnsb_txn, mc->datapath->sb, + sbmc = create_sb_multicast_group(ovnsb_txn, mc->datapath->sdp->sb_dp, mc->group->name, mc->group->key); ovn_multicast_update_sbrec(mc, sbmc); } @@ -579,7 +579,7 @@ ovn_igmp_group_add(struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp, const struct sbrec_multicast_group *mcgroup = mcast_group_lookup(sbrec_mcast_group_by_name_dp, address_s, - datapath->sb); + datapath->sdp->sb_dp); igmp_group->datapath = datapath; igmp_group->address = *address; diff --git a/northd/en-northd.c b/northd/en-northd.c index b2986edf1..85db90537 100644 --- a/northd/en-northd.c +++ b/northd/en-northd.c @@ -66,10 +66,6 @@ northd_get_input_data(struct engine_node *node, engine_get_input("NB_mirror", node), "nbrec_mirror_by_type_and_sink"); - input_data->nbrec_logical_switch_table = - EN_OVSDB_GET(engine_get_input("NB_logical_switch", node)); - input_data->nbrec_logical_router_table = - EN_OVSDB_GET(engine_get_input("NB_logical_router", node)); input_data->nbrec_static_mac_binding_table = EN_OVSDB_GET(engine_get_input("NB_static_mac_binding", node)); input_data->nbrec_chassis_template_var_table = diff --git a/northd/en-port-group.c b/northd/en-port-group.c index 504b5befd..476c0a18d 100644 --- a/northd/en-port-group.c +++ b/northd/en-port-group.c @@ -270,7 +270,8 @@ ls_port_group_process(struct ls_port_group_table *ls_port_groups, struct ls_port_group *ls_pg = ls_port_group_table_find(ls_port_groups, od->nbs); if (!ls_pg) { - ls_pg = ls_port_group_create(ls_port_groups, od->nbs, od->sb); + ls_pg = ls_port_group_create(ls_port_groups, od->nbs, + od->sdp->sb_dp); } struct ls_port_group_record *ls_pg_rec = diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c index c0f1d067a..07e189859 100644 --- a/northd/inc-proc-northd.c +++ b/northd/inc-proc-northd.c @@ -193,14 +193,6 @@ 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_lb_data, &en_nb_load_balancer, - lb_data_load_balancer_handler); - engine_add_input(&en_lb_data, &en_nb_load_balancer_group, - lb_data_load_balancer_group_handler); - engine_add_input(&en_lb_data, &en_nb_logical_switch, - lb_data_logical_switch_handler); - engine_add_input(&en_lb_data, &en_nb_logical_router, - lb_data_logical_router_handler); engine_add_input(&en_sampling_app, &en_nb_sampling_app, NULL); @@ -239,6 +231,15 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, engine_add_input(&en_datapath_synced_logical_switch, &en_datapath_sync, en_datapath_synced_logical_switch_datapath_sync_handler); + engine_add_input(&en_lb_data, &en_nb_load_balancer, + lb_data_load_balancer_handler); + engine_add_input(&en_lb_data, &en_nb_load_balancer_group, + lb_data_load_balancer_group_handler); + engine_add_input(&en_lb_data, &en_datapath_synced_logical_switch, + lb_data_synced_logical_switch_handler); + engine_add_input(&en_lb_data, &en_datapath_synced_logical_router, + lb_data_synced_logical_router_handler); + engine_add_input(&en_northd, &en_nb_mirror, NULL); engine_add_input(&en_northd, &en_nb_mirror_rule, NULL); engine_add_input(&en_northd, &en_nb_static_mac_binding, NULL); @@ -247,7 +248,6 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, engine_add_input(&en_northd, &en_sb_chassis, NULL); engine_add_input(&en_northd, &en_sb_mirror, NULL); engine_add_input(&en_northd, &en_sb_meter, NULL); - engine_add_input(&en_northd, &en_sb_datapath_binding, NULL); engine_add_input(&en_northd, &en_sb_dns, NULL); engine_add_input(&en_northd, &en_sb_ha_chassis_group, NULL); engine_add_input(&en_northd, &en_sb_ip_multicast, NULL); @@ -271,19 +271,14 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, engine_add_input(&en_northd, &en_sb_port_binding, northd_sb_port_binding_handler); - engine_add_input(&en_northd, &en_nb_logical_switch, + engine_add_input(&en_northd, &en_datapath_synced_logical_switch, northd_nb_logical_switch_handler); - engine_add_input(&en_northd, &en_nb_logical_router, + engine_add_input(&en_northd, &en_datapath_synced_logical_router, northd_nb_logical_router_handler); engine_add_input(&en_northd, &en_lb_data, northd_lb_data_handler); engine_add_input(&en_northd, &en_nb_port_group, northd_nb_port_group_handler); - engine_add_input(&en_northd, &en_datapath_synced_logical_router, - engine_noop_handler); - engine_add_input(&en_northd, &en_datapath_synced_logical_switch, - engine_noop_handler); - engine_add_input(&en_lr_nat, &en_northd, lr_nat_northd_handler); engine_add_input(&en_lr_stateful, &en_northd, lr_stateful_northd_handler); diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c index 18b88cf9e..31476286a 100644 --- a/northd/lflow-mgr.c +++ b/northd/lflow-mgr.c @@ -1118,7 +1118,7 @@ sync_lflow_to_sb(struct ovn_lflow *lflow, } if (lflow->od) { - sbrec_logical_flow_set_logical_datapath(sbflow, lflow->od->sb); + sbrec_logical_flow_set_logical_datapath(sbflow, lflow->od->sdp->sb_dp); sbrec_logical_flow_set_logical_dp_group(sbflow, NULL); } else { sbrec_logical_flow_set_logical_datapath(sbflow, NULL); @@ -1226,7 +1226,7 @@ ovn_sb_insert_or_update_logical_dp_group( sb = xmalloc(bitmap_count1(dpg_bitmap, ods_size(datapaths)) * sizeof *sb); BITMAP_FOR_EACH_1 (index, ods_size(datapaths), dpg_bitmap) { - sb[n++] = datapaths->array[index]->sb; + sb[n++] = datapaths->array[index]->sdp->sb_dp; } if (!dp_group) { struct uuid dpg_uuid = uuid_random(); diff --git a/northd/northd.c b/northd/northd.c index 0a12b392d..f9827d38f 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -518,11 +518,11 @@ static struct ovn_datapath * ovn_datapath_create(struct hmap *datapaths, const struct uuid *key, const struct nbrec_logical_switch *nbs, const struct nbrec_logical_router *nbr, - const struct sbrec_datapath_binding *sb) + const struct ovn_synced_datapath *sdp) { struct ovn_datapath *od = xzalloc(sizeof *od); od->key = *key; - od->sb = sb; + od->sdp = sdp; od->nbs = nbs; od->nbr = nbr; hmap_init(&od->port_tnlids); @@ -537,7 +537,7 @@ ovn_datapath_create(struct hmap *datapaths, const struct uuid *key, od->localnet_ports = VECTOR_EMPTY_INITIALIZER(struct ovn_port *); od->lb_with_stateless_mode = false; od->ipam_info_initialized = false; - od->tunnel_key = sb->tunnel_key; + od->tunnel_key = sdp->sb_dp->tunnel_key; init_mcast_info_for_datapath(od); return od; } @@ -633,7 +633,7 @@ ovn_datapath_from_sbrec(const struct hmap *ls_datapaths, } struct ovn_datapath *od = ovn_datapath_find_(dps, &key); - if (od && (od->sb == sb)) { + if (od && (od->sdp->sb_dp == sb)) { return od; } @@ -752,7 +752,7 @@ store_mcast_info_for_switch_datapath(const struct sbrec_ip_multicast *sb, { struct mcast_switch_info *mcast_sw_info = &od->mcast_info.sw; - sbrec_ip_multicast_set_datapath(sb, od->sb); + sbrec_ip_multicast_set_datapath(sb, od->sdp->sb_dp); sbrec_ip_multicast_set_enabled(sb, &mcast_sw_info->enabled, 1); sbrec_ip_multicast_set_querier(sb, &mcast_sw_info->querier, 1); sbrec_ip_multicast_set_table_size(sb, &mcast_sw_info->table_size, 1); @@ -861,7 +861,7 @@ build_datapaths(const struct ovn_synced_logical_switch_map *ls_map, struct ovn_datapath *od = ovn_datapath_create(&ls_datapaths->datapaths, &ls->nb->header_.uuid, - ls->nb, NULL, ls->sdp->sb_dp); + ls->nb, NULL, ls->sdp); init_ipam_info_for_datapath(od); if (smap_get_bool(&od->nbs->other_config, "enable-stateless-acl-with-lb", @@ -875,7 +875,7 @@ build_datapaths(const struct ovn_synced_logical_switch_map *ls_map, struct ovn_datapath *od = ovn_datapath_create(&lr_datapaths->datapaths, &lr->nb->header_.uuid, - NULL, lr->nb, lr->sdp->sb_dp); + NULL, lr->nb, lr->sdp); if (smap_get(&od->nbr->options, "chassis")) { od->is_gw_router = true; } @@ -1446,7 +1446,7 @@ create_mirror_port(struct ovn_port *op, struct hmap *ports, struct ovs_list *both_dbs, struct ovs_list *nb_only, const struct nbrec_mirror *nb_mirror) { - char *mp_name = ovn_mirror_port_name(ovn_datapath_name(op->od->sb), + char *mp_name = ovn_mirror_port_name(ovn_datapath_name(op->od->sdp->sb_dp), nb_mirror->sink); struct ovn_port *mp = ovn_port_find(ports, mp_name); struct ovn_port *target_port = ovn_port_find(ports, nb_mirror->sink); @@ -1490,7 +1490,7 @@ join_logical_ports_lsp(struct hmap *ports, = VLOG_RATE_LIMIT_INIT(5, 1); VLOG_WARN_RL(&rl, "duplicate logical port %s", name); return NULL; - } else if (op && (!op->sb || op->sb->datapath == od->sb)) { + } else if (op && (!op->sb || op->sb->datapath == od->sdp->sb_dp)) { /* * Handle cases where lport type was explicitly changed * in the NBDB, in such cases: @@ -1587,7 +1587,7 @@ join_logical_ports_lrp(struct hmap *ports, name); destroy_lport_addresses(lrp_networks); return NULL; - } else if (op && (!op->sb || op->sb->datapath == od->sb)) { + } else if (op && (!op->sb || op->sb->datapath == od->sdp->sb_dp)) { ovn_port_set_nb(op, NULL, nbrp); ovs_list_remove(&op->list); ovs_list_push_back(both, &op->list); @@ -1660,7 +1660,7 @@ create_cr_port(struct ovn_port *op, struct hmap *ports, op->nbsp ? op->nbsp->name : op->nbrp->name); struct ovn_port *crp = ovn_port_find(ports, redirect_name); - if (crp && crp->sb && crp->sb->datapath == op->od->sb) { + if (crp && crp->sb && crp->sb->datapath == op->od->sdp->sb_dp) { ovn_port_set_nb(crp, op->nbsp, op->nbrp); ovs_list_remove(&crp->list); ovs_list_push_back(both_dbs, &crp->list); @@ -2518,7 +2518,7 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn, unsigned long *queue_id_bitmap, struct sset *active_ha_chassis_grps) { - sbrec_port_binding_set_datapath(op->sb, op->od->sb); + sbrec_port_binding_set_datapath(op->sb, op->od->sdp->sb_dp); if (op->nbrp) { /* Note: SB port binding options for router ports are set in * sync_pbs(). */ @@ -3834,7 +3834,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn, /* When reusing stale Port_Bindings, make sure that stale * Mac_Bindings are purged. */ - if (op->od->sb != op->sb->datapath) { + if (op->od->sdp->sb_dp != op->sb->datapath) { remove_mac_bindings = true; } if (op->nbsp) { @@ -4435,12 +4435,16 @@ northd_handle_ls_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct nbrec_logical_switch *changed_ls; struct northd_tracked_data *trk_data = &nd->trk_data; - NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH_TRACKED (changed_ls, - ni->nbrec_logical_switch_table) { - if (nbrec_logical_switch_is_new(changed_ls) || - nbrec_logical_switch_is_deleted(changed_ls)) { - goto fail; - } + if (!hmapx_is_empty(&ni->synced_lses->new) || + !hmapx_is_empty(&ni->synced_lses->deleted) || + hmapx_is_empty(&ni->synced_lses->updated)) { + goto fail; + } + + struct hmapx_node *node; + HMAPX_FOR_EACH (node, &ni->synced_lses->updated) { + const struct ovn_synced_logical_switch *synced = node->data; + changed_ls = synced->nb; struct ovn_datapath *od = ovn_datapath_find_( &nd->ls_datapaths.datapaths, &changed_ls->header_.uuid); @@ -4677,12 +4681,16 @@ northd_handle_lr_changes(const struct northd_input *ni, { const struct nbrec_logical_router *changed_lr; - NBREC_LOGICAL_ROUTER_TABLE_FOR_EACH_TRACKED (changed_lr, - ni->nbrec_logical_router_table) { - if (nbrec_logical_router_is_new(changed_lr) || - nbrec_logical_router_is_deleted(changed_lr)) { - goto fail; - } + if (!hmapx_is_empty(&ni->synced_lrs->new) || + !hmapx_is_empty(&ni->synced_lrs->deleted) || + hmapx_is_empty(&ni->synced_lrs->updated)) { + goto fail; + } + + struct hmapx_node *node; + HMAPX_FOR_EACH (node, &ni->synced_lrs->updated) { + const struct ovn_synced_logical_router *synced = node->data; + changed_lr = synced->nb; /* Presently only able to handle load balancer, * load balancer group changes and NAT changes. */ @@ -5345,7 +5353,7 @@ build_mirror_lflows(struct ovn_port *op, } char *serving_port_name = ovn_mirror_port_name( - ovn_datapath_name(op->od->sb), + ovn_datapath_name(op->od->sdp->sb_dp), mirror->sink); struct ovn_port *serving_port = ovn_port_find(ls_ports, @@ -18042,13 +18050,13 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn, const struct sbrec_multicast_group *sbmc_flood = mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, - MC_FLOOD, op->od->sb); + MC_FLOOD, op->od->sdp->sb_dp); const struct sbrec_multicast_group *sbmc_flood_l2 = mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, - MC_FLOOD_L2, op->od->sb); + MC_FLOOD_L2, op->od->sdp->sb_dp); const struct sbrec_multicast_group *sbmc_unknown = mcast_group_lookup(lflow_input->sbrec_mcast_group_by_name_dp, - MC_UNKNOWN, op->od->sb); + MC_UNKNOWN, op->od->sdp->sb_dp); struct ds match = DS_EMPTY_INITIALIZER; struct ds actions = DS_EMPTY_INITIALIZER; @@ -18088,13 +18096,13 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn, /* Update SB multicast groups for the new port. */ if (!sbmc_flood) { sbmc_flood = create_sb_multicast_group(ovnsb_txn, - op->od->sb, MC_FLOOD, OVN_MCAST_FLOOD_TUNNEL_KEY); + op->od->sdp->sb_dp, MC_FLOOD, OVN_MCAST_FLOOD_TUNNEL_KEY); } sbrec_multicast_group_update_ports_addvalue(sbmc_flood, op->sb); if (!sbmc_flood_l2) { sbmc_flood_l2 = create_sb_multicast_group(ovnsb_txn, - op->od->sb, MC_FLOOD_L2, + op->od->sdp->sb_dp, MC_FLOOD_L2, OVN_MCAST_FLOOD_L2_TUNNEL_KEY); } sbrec_multicast_group_update_ports_addvalue(sbmc_flood_l2, op->sb); @@ -18102,7 +18110,7 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn, if (op->has_unknown) { if (!sbmc_unknown) { sbmc_unknown = create_sb_multicast_group(ovnsb_txn, - op->od->sb, MC_UNKNOWN, + op->od->sdp->sb_dp, MC_UNKNOWN, OVN_MCAST_UNKNOWN_TUNNEL_KEY); } sbrec_multicast_group_update_ports_addvalue(sbmc_unknown, @@ -18423,7 +18431,7 @@ sync_dns_entries(struct ovsdb_idl_txn *ovnsb_txn, dns_info->n_sbs++; dns_info->sbs = xrealloc(dns_info->sbs, dns_info->n_sbs * sizeof *dns_info->sbs); - dns_info->sbs[dns_info->n_sbs - 1] = od->sb; + dns_info->sbs[dns_info->n_sbs - 1] = od->sdp->sb_dp; } } @@ -18540,7 +18548,7 @@ build_ip_mcast(struct ovsdb_idl_txn *ovnsb_txn, ovs_assert(od->nbs); const struct sbrec_ip_multicast *ip_mcast = - ip_mcast_lookup(sbrec_ip_mcast_by_dp, od->sb); + ip_mcast_lookup(sbrec_ip_mcast_by_dp, od->sdp->sb_dp); if (!ip_mcast) { ip_mcast = sbrec_ip_multicast_insert(ovnsb_txn); @@ -18581,7 +18589,7 @@ build_static_mac_binding_table( } struct ovn_port *op = ovn_port_find(lr_ports, nb_smb->logical_port); - if (!op || !op->nbrp || !op->od || !op->od->sb) { + if (!op || !op->nbrp || !op->od || !op->od->sdp->sb_dp) { sbrec_static_mac_binding_delete(sb_smb); } } @@ -18593,7 +18601,7 @@ build_static_mac_binding_table( struct ovn_port *op = ovn_port_find(lr_ports, nb_smb->logical_port); if (op && op->nbrp) { struct ovn_datapath *od = op->od; - if (od && od->sb) { + if (od && od->sdp->sb_dp) { const struct uuid *nb_uuid = &nb_smb->header_.uuid; const struct sbrec_static_mac_binding *mb = sbrec_static_mac_binding_table_get_for_uuid( @@ -18608,7 +18616,7 @@ build_static_mac_binding_table( sbrec_static_mac_binding_set_mac(mb, nb_smb->mac); sbrec_static_mac_binding_set_override_dynamic_mac(mb, nb_smb->override_dynamic_mac); - sbrec_static_mac_binding_set_datapath(mb, od->sb); + sbrec_static_mac_binding_set_datapath(mb, od->sdp->sb_dp); } else { /* Update existing entry if there is a change*/ if (strcmp(mb->mac, nb_smb->mac)) { diff --git a/northd/northd.h b/northd/northd.h index 79dee03e8..768b9282f 100644 --- a/northd/northd.h +++ b/northd/northd.h @@ -31,8 +31,6 @@ struct northd_input { /* Northbound table references */ - const struct nbrec_logical_switch_table *nbrec_logical_switch_table; - const struct nbrec_logical_router_table *nbrec_logical_router_table; const struct nbrec_static_mac_binding_table *nbrec_static_mac_binding_table; const struct nbrec_chassis_template_var_table @@ -368,7 +366,7 @@ struct ovn_datapath { const struct nbrec_logical_switch *nbs; /* May be NULL. */ const struct nbrec_logical_router *nbr; /* May be NULL. */ - const struct sbrec_datapath_binding *sb; /* May be NULL. */ + const struct ovn_synced_datapath *sdp; /* May be NULL. */ struct ovs_list list; /* In list of similar records. */ diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at index c5892bc5b..39e674dff 100644 --- a/tests/ovn-northd.at +++ b/tests/ovn-northd.at @@ -12015,7 +12015,7 @@ check ovn-nbctl --wait=sb lr-add lr2 -- set logical_router lr2 enabled=false check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats check ovn-nbctl --wait=sb lb-add lb4 10.0.0.40:4040 10.0.40.40:4050 \ -- lr-lb-add lr2 lb4 -check_engine_stats northd recompute nocompute +check_engine_stats northd norecompute compute CHECK_NO_CHANGE_AFTER_RECOMPUTE AT_CLEANUP -- 2.49.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev