On Fri, Jul 18, 2025 at 6:16 PM Mark Michelson via dev <
ovs-dev@openvswitch.org> wrote:

> 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>
> ---
>

Hi Mark,

thank you for the patch, I have two small nit down below.


>  northd/en-lb-data.c      | 265 +++++++++++++++++++++++----------------
>  northd/en-lb-data.h      |   4 +-
>  northd/en-northd.c       |   4 -
>  northd/inc-proc-northd.c |  38 ++----
>  northd/northd.c          |  30 +++--
>  northd/northd.h          |   2 -
>  tests/ovn-northd.at      |   2 +-
>  7 files changed, 192 insertions(+), 153 deletions(-)
>
> diff --git a/northd/en-lb-data.c b/northd/en-lb-data.c
> index 3b19d9ac9..c0042c4df 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,160 @@ 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 = xzalloc(sizeof *codlb);
>

This is a nice opportunity to use xmalloc and designated initializers.


> +    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);
> +    }
> +
> +    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 +574,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 +599,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 +848,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-northd.c b/northd/en-northd.c
> index 60f3f2ef9..ff89830bd 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/inc-proc-northd.c b/northd/inc-proc-northd.c
> index c126c4fb3..6bf8dde3f 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);
>
> @@ -238,6 +230,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);
>

The first two didn't have to move.


> +    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);
> @@ -269,31 +270,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);
>
> -    /* Currently, northd handles logical router and switch changes in
> nodes
> -     * that read directly from the northbound logical tables. Those nodes
> -     * will trigger a recompute if conditions on changed logical routers
> -     * or logical switches cannot be handled. From en-northd's
> perspective,
> -     * synced logical switch and router changes are always handled.
> -     *
> -     * Once datapath syncing has incremental processing added, then
> -     * en-northd can move its logical router and switch change handling to
> -     * handlers defined here, and there will be no need for en_northd to
> -     * read directly from the northbound database for incremental handling
> -     * of these types.
> -     */
> -    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/northd.c b/northd/northd.c
> index 00d1434cb..9df8f10e0 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -4864,12 +4864,15 @@ 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)) {
> +        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);
> @@ -5063,12 +5066,15 @@ 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)) {
> +        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. */
> diff --git a/northd/northd.h b/northd/northd.h
> index 4c142cde0..599a81d79 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
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index 6b0711c54..d0843582a 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -12127,7 +12127,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
>
>
Other than that it looks good to me, thanks.

Acked-by: Ales Musil <amu...@redhat.com>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to