On Tue, Dec 16, 2025 at 7:45 PM Mark Michelson via dev <
[email protected]> wrote:

> This commit changes the lflow syncing functions to no longer use
> ovn_datapaths in favor of ovn_synced_datapaths. Rather than passing
> individual switch and router maps, we pass an array of all datapath
> types. We can then select the map we want using the const index values
> DP_SWITCH and DP_ROUTER. As new datapath types get added, this will
> automatically accommodate those without having to change the functions.
>
> This change sprawled out a bit, since the syncing functions call further
> functions that in turn used ovn_datapaths. Since this required us to
> change ovn_dp_group_create(), we also had to update the en-sync-sb
> code as part of this commit.
>
>
nit: Missing Reported-at tag.


> Signed-off-by: Mark Michelson <[email protected]>
> ---
>  northd/en-lflow.c                |  22 +++---
>  northd/en-sync-sb.c              |  47 ++++++-------
>  northd/inc-proc-northd.c         |   3 +
>  northd/lflow-mgr.c               | 111 ++++++++++++-------------------
>  northd/lflow-mgr.h               |  11 ++-
>  northd/northd.c                  |  37 ++++-------
>  northd/northd.h                  |   1 +
>  tests/ovn-inc-proc-graph-dump.at |   2 +
>  8 files changed, 100 insertions(+), 134 deletions(-)
>
> diff --git a/northd/en-lflow.c b/northd/en-lflow.c
> index 6512b70b0..41a5a97ff 100644
> --- a/northd/en-lflow.c
> +++ b/northd/en-lflow.c
> @@ -29,6 +29,7 @@
>  #include "en-meters.h"
>  #include "en-sampling-app.h"
>  #include "en-group-ecmp-route.h"
> +#include "en-datapath-sync.h"
>  #include "lflow-mgr.h"
>
>  #include "lib/inc-proc-eng.h"
> @@ -69,6 +70,8 @@ lflow_get_input_data(struct engine_node *node,
>          engine_get_input_data("multicast_igmp", node);
>      struct ic_learned_svc_monitors_data *ic_learned_svc_monitors_data =
>          engine_get_input_data("ic_learned_svc_monitors", node);
> +    struct all_synced_datapaths *all_dps =
> +        engine_get_input_data("datapath_sync", node);
>
>      lflow_input->sbrec_logical_flow_table =
>          EN_OVSDB_GET(engine_get_input("SB_logical_flow", node));
> @@ -115,6 +118,7 @@ lflow_get_input_data(struct engine_node *node,
>      struct ed_type_sampling_app_data *sampling_app_data =
>          engine_get_input_data("sampling_app", node);
>      lflow_input->sampling_apps = &sampling_app_data->apps;
> +    lflow_input->dps = all_dps->synced_dps;
>  }
>
>  enum engine_node_state
> @@ -269,8 +273,7 @@ lflow_multicast_igmp_handler(struct engine_node *node,
> void *data)
>      if (!lflow_ref_resync_flows(mcast_igmp_data->lflow_ref,
>                                  lflow_data->lflow_table,
>                                  eng_ctx->ovnsb_idl_txn,
> -                                lflow_input.ls_datapaths,
> -                                lflow_input.lr_datapaths,
> +                                lflow_input.dps,
>                                  lflow_input.ovn_internal_version_changed,
>                                  lflow_input.sbrec_logical_flow_table,
>
>  lflow_input.sbrec_logical_dp_group_table)) {
> @@ -285,8 +288,7 @@ lflow_multicast_igmp_handler(struct engine_node *node,
> void *data)
>      if (!lflow_ref_sync_lflows(mcast_igmp_data->lflow_ref,
>                                 lflow_data->lflow_table,
>                                 eng_ctx->ovnsb_idl_txn,
> -                               lflow_input.ls_datapaths,
> -                               lflow_input.lr_datapaths,
> +                               lflow_input.dps,
>                                 lflow_input.ovn_internal_version_changed,
>                                 lflow_input.sbrec_logical_flow_table,
>                                 lflow_input.sbrec_logical_dp_group_table))
> {
> @@ -326,8 +328,7 @@ lflow_group_ecmp_route_change_handler(struct
> engine_node *node,
>
>          bool handled = lflow_ref_sync_lflows(
>              route_node->lflow_ref, lflow_data->lflow_table,
> -            eng_ctx->ovnsb_idl_txn, lflow_input.ls_datapaths,
> -            lflow_input.lr_datapaths,
> +            eng_ctx->ovnsb_idl_txn, lflow_input.dps,
>              lflow_input.ovn_internal_version_changed,
>              lflow_input.sbrec_logical_flow_table,
>              lflow_input.sbrec_logical_dp_group_table);
> @@ -348,8 +349,7 @@ lflow_group_ecmp_route_change_handler(struct
> engine_node *node,
>
>          bool handled = lflow_ref_sync_lflows(
>              route_node->lflow_ref, lflow_data->lflow_table,
> -            eng_ctx->ovnsb_idl_txn, lflow_input.ls_datapaths,
> -            lflow_input.lr_datapaths,
> +            eng_ctx->ovnsb_idl_txn, lflow_input.dps,
>              lflow_input.ovn_internal_version_changed,
>              lflow_input.sbrec_logical_flow_table,
>              lflow_input.sbrec_logical_dp_group_table);
> @@ -383,8 +383,7 @@ lflow_ic_learned_svc_mons_handler(struct engine_node
> *node,
>              ic_learned_svc_monitors_data->lflow_ref,
>              lflow_data->lflow_table,
>              eng_ctx->ovnsb_idl_txn,
> -            lflow_input.ls_datapaths,
> -            lflow_input.lr_datapaths,
> +            lflow_input.dps,
>              lflow_input.ovn_internal_version_changed,
>              lflow_input.sbrec_logical_flow_table,
>              lflow_input.sbrec_logical_dp_group_table)) {
> @@ -401,8 +400,7 @@ lflow_ic_learned_svc_mons_handler(struct engine_node
> *node,
>              ic_learned_svc_monitors_data->lflow_ref,
>              lflow_data->lflow_table,
>              eng_ctx->ovnsb_idl_txn,
> -            lflow_input.ls_datapaths,
> -            lflow_input.lr_datapaths,
> +            lflow_input.dps,
>              lflow_input.ovn_internal_version_changed,
>              lflow_input.sbrec_logical_flow_table,
>              lflow_input.sbrec_logical_dp_group_table)) {
> diff --git a/northd/en-sync-sb.c b/northd/en-sync-sb.c
> index 8c8c5de05..bc0d74712 100644
> --- a/northd/en-sync-sb.c
> +++ b/northd/en-sync-sb.c
> @@ -27,6 +27,7 @@
>  #include "en-global-config.h"
>  #include "en-lr-stateful.h"
>  #include "en-sync-sb.h"
> +#include "en-datapath-sync.h"
>  #include "lb.h"
>  #include "lib/inc-proc-eng.h"
>  #include "lib/lb.h"
> @@ -250,24 +251,21 @@ static void sb_lb_table_build_and_sync(struct
> sb_lb_table *,
>                                  const struct sbrec_load_balancer_table *,
>                                  const struct sbrec_logical_dp_group_table
> *,
>                                  struct hmap *lb_dps_map,
> -                                struct ovn_datapaths *ls_datapaths,
> -                                struct ovn_datapaths *lr_datapaths,
> +                                const struct ovn_synced_datapaths
> dps[DP_MAX],
>                                  struct chassis_features *);
>  static bool sync_sb_lb_record(struct sb_lb_record *,
>                                const struct sbrec_load_balancer *,
>                                const struct sbrec_logical_dp_group_table *,
>                                struct sb_lb_table *,
>                                struct ovsdb_idl_txn *ovnsb_txn,
> -                              struct ovn_datapaths *ls_datapaths,
> -                              struct ovn_datapaths *lr_datapaths,
> +                              const struct ovn_synced_datapaths
> dps[DP_MAX],
>                                struct chassis_features *);
>  static bool sync_changed_lbs(struct sb_lb_table *,
>                               struct ovsdb_idl_txn *ovnsb_txn,
>                               const struct sbrec_load_balancer_table *,
>                               const struct sbrec_logical_dp_group_table *,
>                               struct tracked_lbs *,
> -                             struct ovn_datapaths *ls_datapaths,
> -                             struct ovn_datapaths *lr_datapaths,
> +                             const struct ovn_synced_datapaths
> dps[DP_MAX],
>                               struct chassis_features *);
>
>  void *
> @@ -290,6 +288,8 @@ en_sync_to_sb_lb_run(struct engine_node *node, void
> *data_)
>          EN_OVSDB_GET(engine_get_input("SB_logical_dp_group", node));
>      struct ed_type_global_config *global_config =
>          engine_get_input_data("global_config", node);
> +    const struct all_synced_datapaths *all_dps =
> +        engine_get_input_data("datapath_sync", node);
>      const struct engine_context *eng_ctx = engine_get_context();
>      struct ed_type_sync_to_sb_lb_data *data = data_;
>
> @@ -298,8 +298,7 @@ en_sync_to_sb_lb_run(struct engine_node *node, void
> *data_)
>                                 sb_load_balancer_table,
>                                 sb_dpgrp_table,
>                                 &northd_data->lb_datapaths_map,
> -                               &northd_data->ls_datapaths,
> -                               &northd_data->lr_datapaths,
> +                               all_dps->synced_dps,
>                                 &global_config->features);
>
>      return EN_UPDATED;
> @@ -333,11 +332,13 @@ sync_to_sb_lb_northd_handler(struct engine_node
> *node, void *data_)
>          EN_OVSDB_GET(engine_get_input("SB_load_balancer", node));
>      struct ed_type_global_config *global_config =
>          engine_get_input_data("global_config", node);
> +    const struct all_synced_datapaths *all_dps =
> +        engine_get_input_data("datapath_sync", node);
>      struct ed_type_sync_to_sb_lb_data *data = data_;
>
>      if (!sync_changed_lbs(&data->sb_lbs, eng_ctx->ovnsb_idl_txn,
> sb_lb_table,
>                            sb_dpgrp_table, &nd->trk_data.trk_lbs,
> -                          &nd->ls_datapaths, &nd->lr_datapaths,
> +                          all_dps->synced_dps,
>                            &global_config->features)) {
>          return EN_UNHANDLED;
>      }
> @@ -690,8 +691,8 @@ sb_lb_table_build_and_sync(
>      struct sb_lb_table *sb_lbs, struct ovsdb_idl_txn *ovnsb_txn,
>      const struct sbrec_load_balancer_table *sb_lb_table,
>      const struct sbrec_logical_dp_group_table *sb_dpgrp_table,
> -    struct hmap *lb_dps_map, struct ovn_datapaths *ls_datapaths,
> -    struct ovn_datapaths *lr_datapaths,
> +    struct hmap *lb_dps_map,
> +    const struct ovn_synced_datapaths dps[DP_MAX],
>      struct chassis_features *chassis_features)
>  {
>      struct hmap tmp_sb_lbs = HMAP_INITIALIZER(&tmp_sb_lbs);
> @@ -717,8 +718,8 @@ sb_lb_table_build_and_sync(
>          if (sb_lb) {
>              sb_lb->sbrec_lb = sbrec_lb;
>              bool success = sync_sb_lb_record(sb_lb, sbrec_lb,
> sb_dpgrp_table,
> -                                             sb_lbs, ovnsb_txn,
> ls_datapaths,
> -                                             lr_datapaths,
> chassis_features);
> +                                             sb_lbs, ovnsb_txn, dps,
> +                                             chassis_features);
>              /* Since we are rebuilding and syncing,  sync_sb_lb_record
> should
>               * not return false. */
>              ovs_assert(success);
> @@ -733,8 +734,7 @@ sb_lb_table_build_and_sync(
>
>      HMAP_FOR_EACH_POP (sb_lb, key_node, &tmp_sb_lbs) {
>          bool success = sync_sb_lb_record(sb_lb, NULL, sb_dpgrp_table,
> sb_lbs,
> -                                         ovnsb_txn, ls_datapaths,
> lr_datapaths,
> -                                         chassis_features);
> +                                         ovnsb_txn, dps,
> chassis_features);
>          /* Since we are rebuilding and syncing,  sync_sb_lb_record should
> not
>           * return false. */
>          ovs_assert(success);
> @@ -752,8 +752,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
>                    const struct sbrec_logical_dp_group_table
> *sb_dpgrp_table,
>                    struct sb_lb_table *sb_lbs,
>                    struct ovsdb_idl_txn *ovnsb_txn,
> -                  struct ovn_datapaths *ls_datapaths,
> -                  struct ovn_datapaths *lr_datapaths,
> +                  const struct ovn_synced_datapaths dps[DP_MAX],
>                    struct chassis_features *chassis_features)
>  {
>      struct sbrec_logical_dp_group *sbrec_ls_dp_group = NULL;
> @@ -781,7 +780,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
>      if (!dynamic_bitmap_is_empty(&lb_dps->nb_ls_map)) {
>          sb_lb->ls_dpg = ovn_dp_group_get(&sb_lbs->ls_dp_groups,
>                                           &lb_dps->nb_ls_map,
> -                                         ods_size(ls_datapaths));
> +                                         dps[DP_SWITCH].dps_array.len);
>          if (sb_lb->ls_dpg) {
>              /* Update the dpg's sb dp_group. */
>              sb_lb->ls_dpg->dp_group =
> @@ -810,7 +809,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
>          } else {
>              sb_lb->ls_dpg = ovn_dp_group_create(
>                  ovnsb_txn, &sb_lbs->ls_dp_groups, sbrec_ls_dp_group,
> -                &lb_dps->nb_ls_map, ls_datapaths);
> +                &lb_dps->nb_ls_map, &dps[DP_SWITCH]);
>          }
>
>          if (chassis_features->ls_dpg_column) {
> @@ -833,7 +832,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
>      if (!dynamic_bitmap_is_empty(&lb_dps->nb_lr_map)) {
>          sb_lb->lr_dpg = ovn_dp_group_get(&sb_lbs->lr_dp_groups,
>                                           &lb_dps->nb_lr_map,
> -                                         ods_size(lr_datapaths));
> +                                         dps[DP_ROUTER].dps_array.len);
>          if (sb_lb->lr_dpg) {
>              /* Update the dpg's sb dp_group. */
>              sb_lb->lr_dpg->dp_group =
> @@ -862,7 +861,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb,
>          } else {
>              sb_lb->lr_dpg = ovn_dp_group_create(
>                  ovnsb_txn, &sb_lbs->lr_dp_groups, sbrec_lr_dp_group,
> -                &lb_dps->nb_lr_map, lr_datapaths);
> +                &lb_dps->nb_lr_map, &dps[DP_ROUTER]);
>          }
>
>          sbrec_load_balancer_set_lr_datapath_group(sbrec_lb,
> @@ -907,8 +906,7 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs,
>                   const struct sbrec_load_balancer_table *sb_lb_table,
>                   const struct sbrec_logical_dp_group_table
> *sb_dpgrp_table,
>                   struct tracked_lbs *trk_lbs,
> -                 struct ovn_datapaths *ls_datapaths,
> -                 struct ovn_datapaths *lr_datapaths,
> +                 const struct ovn_synced_datapaths dps[DP_MAX],
>                   struct chassis_features *chassis_features)
>  {
>      struct ovn_lb_datapaths *lb_dps;
> @@ -967,8 +965,7 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs,
>          }
>
>          if (!sync_sb_lb_record(sb_lb, sb_lb->sbrec_lb, sb_dpgrp_table,
> sb_lbs,
> -                               ovnsb_txn, ls_datapaths, lr_datapaths,
> -                               chassis_features)) {
> +                               ovnsb_txn, dps, chassis_features)) {
>              return false;
>          }
>      }
> diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c
> index b9ac33dc3..cbaebfbf1 100644
> --- a/northd/inc-proc-northd.c
> +++ b/northd/inc-proc-northd.c
> @@ -406,6 +406,7 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb,
>
>      engine_add_input(&en_lflow, &en_sampling_app, NULL);
>
> +    engine_add_input(&en_lflow, &en_datapath_sync, engine_noop_handler);
>      engine_add_input(&en_lflow, &en_northd, lflow_northd_handler);
>      /* No need for an explicit handler for port_groups in the en_lflow
> node.
>       * Stateful configuration changes are passed through the
> en_ls_stateful
> @@ -441,6 +442,8 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb,
>
>      engine_add_input(&en_sync_to_sb_lb, &en_global_config,
>                       node_global_config_handler);
> +    engine_add_input(&en_sync_to_sb_lb, &en_datapath_sync,
> +                     engine_noop_handler);
>

nit: Missing comment why noop handler is used.


>      engine_add_input(&en_sync_to_sb_lb, &en_northd,
>                       sync_to_sb_lb_northd_handler);
>      engine_add_input(&en_sync_to_sb_lb, &en_sb_load_balancer,
> diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c
> index 21a47021b..87380962b 100644
> --- a/northd/lflow-mgr.c
> +++ b/northd/lflow-mgr.c
> @@ -67,7 +67,7 @@ static struct sbrec_logical_dp_group
> *ovn_sb_insert_or_update_logical_dp_group(
>      struct ovsdb_idl_txn *ovnsb_txn,
>      struct sbrec_logical_dp_group *,
>      const struct dynamic_bitmap *dpg_bitmap,
> -    const struct ovn_datapaths *);
> +    const struct ovn_synced_datapaths *);
>  static struct ovn_dp_group *ovn_dp_group_find(
>          const struct hmap *dp_groups,
>          const struct dynamic_bitmap *dpg_bitmap,
> @@ -85,15 +85,14 @@ static void ovn_dp_group_add_with_reference(
>  static bool lflow_ref_sync_lflows__(
>      struct lflow_ref  *, struct lflow_table *,
>      struct ovsdb_idl_txn *ovnsb_txn,
> -    const struct ovn_datapaths *ls_datapaths,
> -    const struct ovn_datapaths *lr_datapaths,
> +    const struct ovn_synced_datapaths dps[DP_MAX],
>      bool ovn_internal_version_changed,
>      const struct sbrec_logical_flow_table *,
>      const struct sbrec_logical_dp_group_table *);
>  static bool sync_lflow_to_sb(struct ovn_lflow *,
>                               struct ovsdb_idl_txn *ovnsb_txn,
>                               struct hmap *dp_groups,
> -                             const struct ovn_datapaths *datapaths,
> +                             const struct ovn_synced_datapaths *datapaths,
>                               bool ovn_internal_version_changed,
>                               const struct sbrec_logical_flow *sbflow,
>                               const struct sbrec_logical_dp_group_table *);
> @@ -261,8 +260,7 @@ lflow_table_set_size(struct lflow_table *lflow_table,
> size_t size)
>  void
>  lflow_table_sync_to_sb(struct lflow_table *lflow_table,
>                         struct ovsdb_idl_txn *ovnsb_txn,
> -                       const struct ovn_datapaths *ls_datapaths,
> -                       const struct ovn_datapaths *lr_datapaths,
> +                       const struct ovn_synced_datapaths dps[DP_MAX],
>                         bool ovn_internal_version_changed,
>                         const struct sbrec_logical_flow_table
> *sb_flow_table,
>                         const struct sbrec_logical_dp_group_table
> *dpgrp_table)
> @@ -290,16 +288,12 @@ lflow_table_sync_to_sb(struct lflow_table
> *lflow_table,
>              sbflow = sbrec_logical_flow_table_get_for_uuid(sb_flow_table,
>
> &lflow->sb_uuid);
>          }
> -        const struct ovn_datapaths *datapaths;
> +        const struct ovn_synced_datapaths *datapaths;
>          struct hmap *dp_groups;
>          enum ovn_datapath_type dp_type =
>              ovn_stage_to_datapath_type(lflow->stage);
>          dp_groups = &lflow_table->dp_groups[dp_type];
> -        if (dp_type == DP_SWITCH) {
> -            datapaths = ls_datapaths;
> -        } else {
> -            datapaths = lr_datapaths;
> -        }
> +        datapaths = &dps[dp_type];
>          sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths,
>                           ovn_internal_version_changed,
>                           sbflow, dpgrp_table);
> @@ -320,31 +314,29 @@ lflow_table_sync_to_sb(struct lflow_table
> *lflow_table,
>              uuidset_delete(&sb_uuid_set, node);
>          }
>          struct sbrec_logical_dp_group *dp_group =
> sbflow->logical_dp_group;
> -        struct ovn_datapath *logical_datapath_od = NULL;
> +        struct ovn_synced_datapath *sdp = NULL;
>          size_t i;
>
>          /* Find one valid datapath to get the datapath type. */
>          struct sbrec_datapath_binding *dp = sbflow->logical_datapath;
>          if (dp) {
> -            logical_datapath_od = ovn_datapath_from_sbrec(
> -                &ls_datapaths->datapaths, &lr_datapaths->datapaths, dp);
> -            if (logical_datapath_od
> -                && ovn_datapath_is_stale(logical_datapath_od)) {
> -                logical_datapath_od = NULL;
> -            }
> +            enum ovn_datapath_type dp_type =
> +                ovn_datapath_type_from_string(datapath_get_nb_type(dp));
> +            sdp = ovn_synced_datapath_from_sb(&dps[dp_type], dp);
>          }
>          for (i = 0; dp_group && i < dp_group->n_datapaths; i++) {
> -            logical_datapath_od = ovn_datapath_from_sbrec(
> -                &ls_datapaths->datapaths, &lr_datapaths->datapaths,
> -                dp_group->datapaths[i]);
> -            if (logical_datapath_od
> -                && !ovn_datapath_is_stale(logical_datapath_od)) {
> +            enum ovn_datapath_type dp_type =
> +                ovn_datapath_type_from_string(datapath_get_nb_type(
> +                    dp_group->datapaths[i]));
> +            sdp = ovn_synced_datapath_from_sb(&dps[dp_type],
> +                                              dp_group->datapaths[i]);
> +            if (sdp) {
>                  break;
>              }
> -            logical_datapath_od = NULL;
> +            sdp = NULL;
>          }
>
> -        if (!logical_datapath_od) {
> +        if (!sdp) {
>              /* This lflow has no valid logical datapaths. */
>              sbrec_logical_flow_delete(sbflow);
>              continue;
> @@ -358,7 +350,7 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,
>              = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT;
>
>          enum ovn_datapath_type dp_type
> -            = ovn_datapath_get_type(logical_datapath_od);
> +            =
> ovn_datapath_type_from_string(datapath_get_nb_type(sdp->sb_dp));
>
>          /* Since we should have weeded out sb_lflows with invalid
>           * datapaths, we should only get valid datapath types here.
> @@ -372,14 +364,10 @@ lflow_table_sync_to_sb(struct lflow_table
> *lflow_table,
>              sbflow->priority, sbflow->match, sbflow->actions,
>              sbflow->controller_meter, sbflow->hash);
>          if (lflow) {
> -            const struct ovn_datapaths *datapaths;
> +            const struct ovn_synced_datapaths *datapaths;
>              struct hmap *dp_groups;
>              dp_groups = &lflow_table->dp_groups[dp_type];
> -            if (dp_type == DP_SWITCH) {
> -                datapaths = ls_datapaths;
> -            } else {
> -                datapaths = lr_datapaths;
> -            }
> +            datapaths = &dps[dp_type];
>              sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths,
>                               ovn_internal_version_changed,
>                               sbflow, dpgrp_table);
> @@ -396,16 +384,12 @@ lflow_table_sync_to_sb(struct lflow_table
> *lflow_table,
>          if (search_mode != LFLOW_TABLE_SEARCH_FIELDS) {
>              break;
>          }
> -        const struct ovn_datapaths *datapaths;
> +        const struct ovn_synced_datapaths *datapaths;
>          struct hmap *dp_groups;
>          enum ovn_datapath_type dp_type =
>              ovn_stage_to_datapath_type(lflow->stage);
>          dp_groups = &lflow_table->dp_groups[dp_type];
> -        if (dp_type == DP_SWITCH) {
> -            datapaths = ls_datapaths;
> -        } else {
> -            datapaths = lr_datapaths;
> -        }
> +        datapaths = &dps[dp_type];
>          sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths,
>                           ovn_internal_version_changed, NULL, dpgrp_table);
>
> @@ -691,15 +675,14 @@ bool
>  lflow_ref_resync_flows(struct lflow_ref *lflow_ref,
>                         struct lflow_table *lflow_table,
>                         struct ovsdb_idl_txn *ovnsb_txn,
> -                       const struct ovn_datapaths *ls_datapaths,
> -                       const struct ovn_datapaths *lr_datapaths,
> +                       const struct ovn_synced_datapaths dps[DP_MAX],
>                         bool ovn_internal_version_changed,
>                         const struct sbrec_logical_flow_table
> *sbflow_table,
>                         const struct sbrec_logical_dp_group_table
> *dpgrp_table)
>  {
>      lflow_ref_unlink_lflows(lflow_ref);
>      return lflow_ref_sync_lflows__(lflow_ref, lflow_table, ovnsb_txn,
> -                                   ls_datapaths, lr_datapaths,
> +                                   dps,
>                                     ovn_internal_version_changed,
> sbflow_table,
>                                     dpgrp_table);
>  }
> @@ -708,14 +691,13 @@ bool
>  lflow_ref_sync_lflows(struct lflow_ref *lflow_ref,
>                        struct lflow_table *lflow_table,
>                        struct ovsdb_idl_txn *ovnsb_txn,
> -                      const struct ovn_datapaths *ls_datapaths,
> -                      const struct ovn_datapaths *lr_datapaths,
> +                      const struct ovn_synced_datapaths dps[DP_MAX],
>                        bool ovn_internal_version_changed,
>                        const struct sbrec_logical_flow_table *sbflow_table,
>                        const struct sbrec_logical_dp_group_table
> *dpgrp_table)
>  {
>      return lflow_ref_sync_lflows__(lflow_ref, lflow_table, ovnsb_txn,
> -                                   ls_datapaths, lr_datapaths,
> +                                   dps,
>                                     ovn_internal_version_changed,
> sbflow_table,
>                                     dpgrp_table);
>  }
> @@ -845,7 +827,7 @@ ovn_dp_group_create(struct ovsdb_idl_txn *ovnsb_txn,
>                      struct hmap *dp_groups,
>                      struct sbrec_logical_dp_group *sb_group,
>                      const struct dynamic_bitmap *desired_bitmap,
> -                    const struct ovn_datapaths *datapaths)
> +                    const struct ovn_synced_datapaths *datapaths)
>  {
>      struct ovn_dp_group *dpg;
>
> @@ -855,14 +837,14 @@ ovn_dp_group_create(struct ovsdb_idl_txn *ovnsb_txn,
>
>      dynamic_bitmap_alloc(&dpg_bitmap, desired_bitmap->capacity);
>      for (i = 0; sb_group && i < sb_group->n_datapaths; i++) {
> -        struct ovn_datapath *datapath_od;
> +        struct ovn_synced_datapath *sdp;
>
> -        datapath_od = ovn_datapath_from_sbrec_(&datapaths->datapaths,
> -                                               sb_group->datapaths[i]);
> -        if (!datapath_od || ovn_datapath_is_stale(datapath_od)) {
> +        sdp = ovn_synced_datapath_from_sb(datapaths,
> +                                          sb_group->datapaths[i]);
> +        if (!sdp) {
>              break;
>          }
> -        dynamic_bitmap_set1(&dpg_bitmap, datapath_od->sdp->index);
> +        dynamic_bitmap_set1(&dpg_bitmap, sdp->index);
>      }
>      if (!sb_group || i != sb_group->n_datapaths) {
>          /* No group or stale group.  Not going to be used. */
> @@ -1094,7 +1076,7 @@ static bool
>  sync_lflow_to_sb(struct ovn_lflow *lflow,
>                   struct ovsdb_idl_txn *ovnsb_txn,
>                   struct hmap *dp_groups,
> -                 const struct ovn_datapaths *datapaths,
> +                 const struct ovn_synced_datapaths *datapaths,
>                   bool ovn_internal_version_changed,
>                   const struct sbrec_logical_flow *sbflow,
>                   const struct sbrec_logical_dp_group_table
> *sb_dpgrp_table)
> @@ -1103,7 +1085,7 @@ sync_lflow_to_sb(struct ovn_lflow *lflow,
>      struct ovn_dp_group *pre_sync_dpg = lflow->dpg;
>      size_t n_datapaths;
>
> -    n_datapaths = ods_size(datapaths);
> +    n_datapaths = datapaths->dps_array.len;
>
>      size_t n_ods = dynamic_bitmap_count1(&lflow->dpg_bitmap);
>      ovs_assert(n_ods);
> @@ -1111,8 +1093,7 @@ sync_lflow_to_sb(struct ovn_lflow *lflow,
>          /* There is only one datapath, so it should be moved out of the
>           * group to a single 'od'. */
>          size_t index = dynamic_bitmap_scan(&lflow->dpg_bitmap, true, 0);
> -        struct ovn_datapath *od = sparse_array_get(&datapaths->dps,
> index);
> -        lflow->dp = od->sdp;
> +        lflow->dp = sparse_array_get(&datapaths->dps_array, index);
>          lflow->dpg = NULL;
>      } else {
>          lflow->dp = NULL;
> @@ -1305,16 +1286,17 @@ ovn_sb_insert_or_update_logical_dp_group(
>                              struct ovsdb_idl_txn *ovnsb_txn,
>                              struct sbrec_logical_dp_group *dp_group,
>                              const struct dynamic_bitmap *dpg_bitmap,
> -                            const struct ovn_datapaths *datapaths)
> +                            const struct ovn_synced_datapaths *datapaths)
>  {
>      const struct sbrec_datapath_binding **sb;
>      size_t n = 0, index;
>
>      sb = xmalloc(dynamic_bitmap_count1(dpg_bitmap) * sizeof *sb);
>      DYNAMIC_BITMAP_FOR_EACH_1 (index, dpg_bitmap) {
> -        struct ovn_datapath *od = sparse_array_get(&datapaths->dps,
> index);
> -        if (od) {
> -            sb[n++] = od->sdp->sb_dp;
> +        struct ovn_synced_datapath *sdp =
> +            sparse_array_get(&datapaths->dps_array, index);
> +        if (sdp) {
> +            sb[n++] = sdp->sb_dp;
>          }
>      }
>      if (!dp_group) {
> @@ -1351,8 +1333,7 @@ static bool
>  lflow_ref_sync_lflows__(struct lflow_ref  *lflow_ref,
>                          struct lflow_table *lflow_table,
>                          struct ovsdb_idl_txn *ovnsb_txn,
> -                        const struct ovn_datapaths *ls_datapaths,
> -                        const struct ovn_datapaths *lr_datapaths,
> +                        const struct ovn_synced_datapaths dps[DP_MAX],
>                          bool ovn_internal_version_changed,
>                          const struct sbrec_logical_flow_table
> *sbflow_table,
>                          const struct sbrec_logical_dp_group_table
> *dpgrp_table)
> @@ -1366,15 +1347,11 @@ lflow_ref_sync_lflows__(struct lflow_ref
> *lflow_ref,
>                                                    &lflow->sb_uuid);
>
>          struct hmap *dp_groups = NULL;
> -        const struct ovn_datapaths *datapaths;
> +        const struct ovn_synced_datapaths *datapaths;
>          enum ovn_datapath_type dp_type =
>              ovn_stage_to_datapath_type(lflow->stage);
>          dp_groups = &lflow_table->dp_groups[dp_type];
> -        if (dp_type == DP_SWITCH) {
> -            datapaths = ls_datapaths;
> -        } else {
> -            datapaths = lr_datapaths;
> -        }
> +        datapaths = &dps[dp_type];
>
>          size_t n_ods = dynamic_bitmap_count1(&lflow->dpg_bitmap);
>
> diff --git a/northd/lflow-mgr.h b/northd/lflow-mgr.h
> index 9d9904c1e..53ee3c31f 100644
> --- a/northd/lflow-mgr.h
> +++ b/northd/lflow-mgr.h
> @@ -40,8 +40,7 @@ void lflow_table_expand(struct lflow_table *);
>  void lflow_table_set_size(struct lflow_table *, size_t);
>  void lflow_table_sync_to_sb(struct lflow_table *,
>                              struct ovsdb_idl_txn *ovnsb_txn,
> -                            const struct ovn_datapaths *ls_datapaths,
> -                            const struct ovn_datapaths *lr_datapaths,
> +                            const struct ovn_synced_datapaths dps[DP_MAX],
>                              bool ovn_internal_version_changed,
>                              const struct sbrec_logical_flow_table *,
>                              const struct sbrec_logical_dp_group_table *);
> @@ -61,16 +60,14 @@ void lflow_ref_unlink_lflows(struct lflow_ref *);
>  bool lflow_ref_resync_flows(struct lflow_ref *,
>                              struct lflow_table *lflow_table,
>                              struct ovsdb_idl_txn *ovnsb_txn,
> -                            const struct ovn_datapaths *ls_datapaths,
> -                            const struct ovn_datapaths *lr_datapaths,
> +                            const struct ovn_synced_datapaths dps[DP_MAX],
>                              bool ovn_internal_version_changed,
>                              const struct sbrec_logical_flow_table *,
>                              const struct sbrec_logical_dp_group_table *);
>  bool lflow_ref_sync_lflows(struct lflow_ref *,
>                             struct lflow_table *lflow_table,
>                             struct ovsdb_idl_txn *ovnsb_txn,
> -                           const struct ovn_datapaths *ls_datapaths,
> -                           const struct ovn_datapaths *lr_datapaths,
> +                           const struct ovn_synced_datapaths dps[DP_MAX],
>                             bool ovn_internal_version_changed,
>                             const struct sbrec_logical_flow_table *,
>                             const struct sbrec_logical_dp_group_table *);
> @@ -188,7 +185,7 @@ struct ovn_dp_group *ovn_dp_group_create(
>      struct ovsdb_idl_txn *ovnsb_txn, struct hmap *dp_groups,
>      struct sbrec_logical_dp_group *sb_group,
>      const struct dynamic_bitmap *desired_bitmap,
> -    const struct ovn_datapaths *datapaths);
> +    const struct ovn_synced_datapaths *datapaths);
>
>  static inline void
>  inc_ovn_dp_group_ref(struct ovn_dp_group *dpg)
> diff --git a/northd/northd.c b/northd/northd.c
> index a98a09ae2..aa726790a 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -19437,8 +19437,7 @@ void build_lflows(struct ovsdb_idl_txn *ovnsb_txn,
>      lflow_table_expand(lflows);
>
>      stopwatch_start(LFLOWS_TO_SB_STOPWATCH_NAME, time_msec());
> -    lflow_table_sync_to_sb(lflows, ovnsb_txn, input_data->ls_datapaths,
> -                           input_data->lr_datapaths,
> +    lflow_table_sync_to_sb(lflows, ovnsb_txn, input_data->dps,
>                             input_data->ovn_internal_version_changed,
>                             input_data->sbrec_logical_flow_table,
>                             input_data->sbrec_logical_dp_group_table);
> @@ -19493,8 +19492,7 @@ lflow_handle_northd_port_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>          /* Make sure 'op' is an lsp and not lrp. */
>          ovs_assert(op->nbsp);
>          bool handled = lflow_ref_resync_flows(
> -            op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,
> -            lflow_input->lr_datapaths,
> +            op->lflow_ref, lflows, ovnsb_txn, lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19522,8 +19520,7 @@ lflow_handle_northd_port_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>                                                   lflows);
>          /* Sync the new flows to SB. */
>          bool handled = lflow_ref_sync_lflows(
> -            op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,
> -            lflow_input->lr_datapaths,
> +            op->lflow_ref, lflows, ovnsb_txn, lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19536,8 +19533,7 @@ lflow_handle_northd_port_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>                                                &match, &actions, lflows);
>              handled = lflow_ref_sync_lflows(
>                  op->stateful_lflow_ref, lflows, ovnsb_txn,
> -                lflow_input->ls_datapaths,
> -                lflow_input->lr_datapaths,
> +                lflow_input->dps,
>                  lflow_input->ovn_internal_version_changed,
>                  lflow_input->sbrec_logical_flow_table,
>                  lflow_input->sbrec_logical_dp_group_table);
> @@ -19582,8 +19578,7 @@ lflow_handle_northd_port_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>
>          /* Sync the newly added flows to SB. */
>          bool handled = lflow_ref_sync_lflows(
> -            op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,
> -            lflow_input->lr_datapaths,
> +            op->lflow_ref, lflows, ovnsb_txn, lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19594,8 +19589,7 @@ lflow_handle_northd_port_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>                                                &match, &actions, lflows);
>              handled = lflow_ref_sync_lflows(
>                  op->stateful_lflow_ref, lflows, ovnsb_txn,
> -                lflow_input->ls_datapaths,
> -                lflow_input->lr_datapaths,
> +                lflow_input->dps,
>                  lflow_input->ovn_internal_version_changed,
>                  lflow_input->sbrec_logical_flow_table,
>                  lflow_input->sbrec_logical_dp_group_table);
> @@ -19654,8 +19648,7 @@ lflow_handle_northd_lb_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>          lb_dps = hmapx_node->data;
>
>          lflow_ref_resync_flows(
> -            lb_dps->lflow_ref, lflows, ovnsb_txn,
> lflow_input->ls_datapaths,
> -            lflow_input->lr_datapaths,
> +            lb_dps->lflow_ref, lflows, ovnsb_txn, lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19694,8 +19687,7 @@ lflow_handle_northd_lb_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>
>          /* Sync the new flows to SB. */
>          bool handled = lflow_ref_sync_lflows(
> -            lb_dps->lflow_ref, lflows, ovnsb_txn,
> lflow_input->ls_datapaths,
> -            lflow_input->lr_datapaths,
> +            lb_dps->lflow_ref, lflows, ovnsb_txn, lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19734,7 +19726,7 @@ lflow_handle_lr_stateful_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>          /* Sync the new flows to SB. */
>          handled = lflow_ref_sync_lflows(
>              lr_stateful_rec->lflow_ref, lflows, ovnsb_txn,
> -            lflow_input->ls_datapaths, lflow_input->lr_datapaths,
> +            lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19758,7 +19750,7 @@ lflow_handle_lr_stateful_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>
>              handled = lflow_ref_sync_lflows(
>                  op->stateful_lflow_ref, lflows, ovnsb_txn,
> -                lflow_input->ls_datapaths, lflow_input->lr_datapaths,
> +                lflow_input->dps,
>                  lflow_input->ovn_internal_version_changed,
>                  lflow_input->sbrec_logical_flow_table,
>                  lflow_input->sbrec_logical_dp_group_table);
> @@ -19775,7 +19767,7 @@ lflow_handle_lr_stateful_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>
>                  handled = lflow_ref_sync_lflows(
>                      op->peer->stateful_lflow_ref, lflows, ovnsb_txn,
> -                    lflow_input->ls_datapaths, lflow_input->lr_datapaths,
> +                    lflow_input->dps,
>                      lflow_input->ovn_internal_version_changed,
>                      lflow_input->sbrec_logical_flow_table,
>                      lflow_input->sbrec_logical_dp_group_table);
> @@ -19832,8 +19824,7 @@ lflow_handle_ls_stateful_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>          /* Sync the new flows to SB. */
>          bool handled = lflow_ref_sync_lflows(
>              ls_stateful_rec->lflow_ref, lflows, ovnsb_txn,
> -            lflow_input->ls_datapaths,
> -            lflow_input->lr_datapaths,
> +            lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> @@ -19847,7 +19838,7 @@ lflow_handle_ls_stateful_changes(struct
> ovsdb_idl_txn *ovnsb_txn,
>
>          if (!lflow_ref_resync_flows(
>                      ls_stateful_rec->lflow_ref, lflows, ovnsb_txn,
> -                    lflow_input->ls_datapaths, lflow_input->lr_datapaths,
> +                    lflow_input->dps,
>                      lflow_input->ovn_internal_version_changed,
>                      lflow_input->sbrec_logical_flow_table,
>                      lflow_input->sbrec_logical_dp_group_table)) {
> @@ -19877,7 +19868,7 @@ lflow_handle_ls_arp_changes(struct ovsdb_idl_txn
> *ovnsb_txn,
>
>          bool handled = lflow_ref_sync_lflows(
>              ls_arp_record->lflow_ref, lflows, ovnsb_txn,
> -            lflow_input->ls_datapaths, lflow_input->lr_datapaths,
> +            lflow_input->dps,
>              lflow_input->ovn_internal_version_changed,
>              lflow_input->sbrec_logical_flow_table,
>              lflow_input->sbrec_logical_dp_group_table);
> diff --git a/northd/northd.h b/northd/northd.h
> index ffaa78d10..185bf4cb5 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -266,6 +266,7 @@ struct lflow_input {
>      /* Indexes */
>      struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp;
>
> +    const struct ovn_synced_datapaths *dps;
>      const struct ovn_datapaths *ls_datapaths;
>      const struct ovn_datapaths *lr_datapaths;
>      const struct hmap *ls_ports;
> diff --git a/tests/ovn-inc-proc-graph-dump.at b/tests/
> ovn-inc-proc-graph-dump.at
> index eb00ccc7d..d77722adf 100644
> --- a/tests/ovn-inc-proc-graph-dump.at
> +++ b/tests/ovn-inc-proc-graph-dump.at
> @@ -124,6 +124,7 @@ digraph "Incremental-Processing-Engine" {
>         SB_logical_dp_group [[style=filled, shape=box, fillcolor=white,
> label="SB_logical_dp_group"]];
>         sync_to_sb_lb [[style=filled, shape=box, fillcolor=white,
> label="sync_to_sb_lb"]];
>         global_config -> sync_to_sb_lb
> [[label="node_global_config_handler"]];
> +       datapath_sync -> sync_to_sb_lb [[label="engine_noop_handler"]];
>         northd -> sync_to_sb_lb [[label="sync_to_sb_lb_northd_handler"]];
>         SB_load_balancer -> sync_to_sb_lb
> [[label="sync_to_sb_lb_sb_load_balancer"]];
>         SB_logical_dp_group -> sync_to_sb_lb [[label=""]];
> @@ -185,6 +186,7 @@ digraph "Incremental-Processing-Engine" {
>         group_ecmp_route -> lflow
> [[label="lflow_group_ecmp_route_change_handler"]];
>         global_config -> lflow [[label="node_global_config_handler"]];
>         sampling_app -> lflow [[label=""]];
> +       datapath_sync -> lflow [[label="engine_noop_handler"]];
>         northd -> lflow [[label="lflow_northd_handler"]];
>         port_group -> lflow [[label="engine_noop_handler"]];
>         lr_stateful -> lflow [[label="lflow_lr_stateful_handler"]];
> --
> 2.51.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
With the potential sparse_array changes and nit accounted for:

Acked-by: Ales Musil <[email protected]>

Thanks,
Ales
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to