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

> Prior to this commit, when en-datapath-sync would run, it would combine
> all synced datapaths into a single large hmap. Type-specific synced
> datapath handlers would need to go through this hmap and filter out the
> relevant ones by type.
>
> This commit alters things by making en-datapath-sync sort the synced
> datapaths into type-specific buckets. This then allows downstream engine
> nodes to only look at the synced datapaths corresponding to their type.
>
> Signed-off-by: Mark Michelson <[email protected]>
> ---
>  northd/datapath-sync.h              |   6 --
>  northd/en-datapath-logical-router.c |  23 ++---
>  northd/en-datapath-logical-switch.c |  23 ++---
>  northd/en-datapath-sync.c           | 148 ++++++++++++++++++----------
>  northd/en-datapath-sync.h           |   8 ++
>  5 files changed, 118 insertions(+), 90 deletions(-)
>
> diff --git a/northd/datapath-sync.h b/northd/datapath-sync.h
> index f54b79fab..301b3388d 100644
> --- a/northd/datapath-sync.h
> +++ b/northd/datapath-sync.h
> @@ -94,16 +94,10 @@ struct ovn_synced_datapath {
>
>  struct ovn_synced_datapaths {
>      struct hmap synced_dps;
> -    struct hmap dp_tnlids;
>
>      struct hmapx new;
>      struct hmapx updated;
>      struct hmapx deleted;
> -
> -    /* Cache the vxlan mode setting. This is an easy way for us to detect
> if
> -     * the global configuration resulted in a change to this value.
> -     */
> -    bool vxlan_mode;
>  };
>
>  struct ovn_unsynced_datapath *ovn_unsynced_datapath_alloc(
> diff --git a/northd/en-datapath-logical-router.c
> b/northd/en-datapath-logical-router.c
> index a4b5e2383..ae44ddaf5 100644
> --- a/northd/en-datapath-logical-router.c
> +++ b/northd/en-datapath-logical-router.c
> @@ -24,6 +24,7 @@
>  #include "aging.h"
>  #include "datapath-sync.h"
>  #include "en-datapath-logical-router.h"
> +#include "en-datapath-sync.h"
>  #include "ovn-util.h"
>
>  VLOG_DEFINE_THIS_MODULE(en_datapath_logical_router);
> @@ -308,8 +309,9 @@ synced_logical_router_alloc(const struct
> ovn_synced_datapath *sdp)
>  enum engine_node_state
>  en_datapath_synced_logical_router_run(struct engine_node *node , void
> *data)
>  {
> -    const struct ovn_synced_datapaths *dps =
> +    const struct all_synced_datapaths *all_dps =
>          engine_get_input_data("datapath_sync", node);
> +    const struct ovn_synced_datapaths *dps =
> &all_dps->synced_dps[DP_ROUTER];
>      struct ovn_synced_logical_router_map *router_map = data;
>
>      synced_logical_router_map_destroy(router_map);
> @@ -317,9 +319,6 @@ en_datapath_synced_logical_router_run(struct
> engine_node *node , void *data)
>
>      struct ovn_synced_datapath *sdp;
>      HMAP_FOR_EACH (sdp, hmap_node, &dps->synced_dps) {
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) {
> -            continue;
> -        }
>          struct ovn_synced_logical_router *lr =
>              synced_logical_router_alloc(sdp);
>          hmap_insert(&router_map->synced_routers, &lr->hmap_node,
> @@ -349,13 +348,12 @@ enum engine_input_handler_result
>  en_datapath_synced_logical_router_datapath_sync_handler(
>          struct engine_node *node, void *data)
>  {
> -    const struct ovn_synced_datapaths *dps =
> +    const struct all_synced_datapaths *all_dps =
>          engine_get_input_data("datapath_sync", node);
> +    const struct ovn_synced_datapaths *dps =
> &all_dps->synced_dps[DP_ROUTER];
>      struct ovn_synced_logical_router_map *router_map = data;
>
> -    if (hmapx_is_empty(&dps->deleted) &&
> -        hmapx_is_empty(&dps->new) &&
> -        hmapx_is_empty(&dps->updated)) {
> +    if (!all_dps->has_tracked_data) {
>          return EN_UNHANDLED;
>      }
>
> @@ -364,9 +362,6 @@
> en_datapath_synced_logical_router_datapath_sync_handler(
>      struct ovn_synced_logical_router *lr;
>      HMAPX_FOR_EACH (hmapx_node, &dps->new) {
>          sdp = hmapx_node->data;
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) {
> -            continue;
> -        }
>          lr = synced_logical_router_alloc(sdp);
>          hmap_insert(&router_map->synced_routers, &lr->hmap_node,
>                      uuid_hash(&lr->nb->header_.uuid));
> @@ -375,9 +370,6 @@
> en_datapath_synced_logical_router_datapath_sync_handler(
>
>      HMAPX_FOR_EACH (hmapx_node, &dps->deleted) {
>          sdp = hmapx_node->data;
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) {
> -            continue;
> -        }
>          lr = ovn_synced_logical_router_find(router_map,
> &sdp->nb_row->uuid);
>          if (!lr) {
>              return EN_UNHANDLED;
> @@ -388,9 +380,6 @@
> en_datapath_synced_logical_router_datapath_sync_handler(
>
>      HMAPX_FOR_EACH (hmapx_node, &dps->updated) {
>          sdp = hmapx_node->data;
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_router) {
> -            continue;
> -        }
>          lr = ovn_synced_logical_router_find(router_map,
> &sdp->nb_row->uuid);
>          if (!lr) {
>              return EN_UNHANDLED;
> diff --git a/northd/en-datapath-logical-switch.c
> b/northd/en-datapath-logical-switch.c
> index 71b16ffe0..0c8aaeba3 100644
> --- a/northd/en-datapath-logical-switch.c
> +++ b/northd/en-datapath-logical-switch.c
> @@ -24,6 +24,7 @@
>  #include "ovn-nb-idl.h"
>  #include "datapath-sync.h"
>  #include "en-datapath-logical-switch.h"
> +#include "en-datapath-sync.h"
>  #include "en-global-config.h"
>  #include "ovn-util.h"
>
> @@ -299,8 +300,9 @@ synced_logical_switch_alloc(const struct
> ovn_synced_datapath *sdp)
>  enum engine_node_state
>  en_datapath_synced_logical_switch_run(struct engine_node *node , void
> *data)
>  {
> -    const struct ovn_synced_datapaths *dps =
> +    const struct all_synced_datapaths *all_dps =
>          engine_get_input_data("datapath_sync", node);
> +    const struct ovn_synced_datapaths *dps =
> &all_dps->synced_dps[DP_SWITCH];
>      struct ovn_synced_logical_switch_map *switch_map = data;
>
>      synced_logical_switch_map_destroy(switch_map);
> @@ -308,9 +310,6 @@ en_datapath_synced_logical_switch_run(struct
> engine_node *node , void *data)
>
>      struct ovn_synced_datapath *sdp;
>      HMAP_FOR_EACH (sdp, hmap_node, &dps->synced_dps) {
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) {
> -            continue;
> -        }
>          struct ovn_synced_logical_switch *lsw =
>              synced_logical_switch_alloc(sdp);
>          hmap_insert(&switch_map->synced_switches, &lsw->hmap_node,
> @@ -341,13 +340,12 @@ enum engine_input_handler_result
>  en_datapath_synced_logical_switch_datapath_sync_handler(
>          struct engine_node *node, void *data)
>  {
> -    const struct ovn_synced_datapaths *dps =
> +    const struct all_synced_datapaths *all_dps =
>          engine_get_input_data("datapath_sync", node);
> +    const struct ovn_synced_datapaths *dps =
> &all_dps->synced_dps[DP_SWITCH];
>      struct ovn_synced_logical_switch_map *switch_map = data;
>
> -    if (hmapx_is_empty(&dps->deleted) &&
> -        hmapx_is_empty(&dps->new) &&
> -        hmapx_is_empty(&dps->updated)) {
> +    if (!all_dps->has_tracked_data) {
>          return EN_UNHANDLED;
>      }
>
> @@ -356,9 +354,6 @@
> en_datapath_synced_logical_switch_datapath_sync_handler(
>      struct ovn_synced_logical_switch *lsw;
>      HMAPX_FOR_EACH (hmapx_node, &dps->new) {
>          sdp = hmapx_node->data;
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) {
> -            continue;
> -        }
>          lsw = synced_logical_switch_alloc(sdp);
>          hmap_insert(&switch_map->synced_switches, &lsw->hmap_node,
>                      uuid_hash(&lsw->nb->header_.uuid));
> @@ -367,9 +362,6 @@
> en_datapath_synced_logical_switch_datapath_sync_handler(
>
>      HMAPX_FOR_EACH (hmapx_node, &dps->deleted) {
>          sdp = hmapx_node->data;
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) {
> -            continue;
> -        }
>          lsw = ovn_synced_logical_switch_find(switch_map,
> &sdp->nb_row->uuid);
>          if (!lsw) {
>              return EN_UNHANDLED;
> @@ -380,9 +372,6 @@
> en_datapath_synced_logical_switch_datapath_sync_handler(
>
>      HMAPX_FOR_EACH (hmapx_node, &dps->updated) {
>          sdp = hmapx_node->data;
> -        if (sdp->nb_row->table->class_ != &nbrec_table_logical_switch) {
> -            continue;
> -        }
>          lsw = ovn_synced_logical_switch_find(switch_map,
> &sdp->nb_row->uuid);
>          if (!lsw) {
>              return EN_UNHANDLED;
> diff --git a/northd/en-datapath-sync.c b/northd/en-datapath-sync.c
> index 40ff6b027..74a5c587c 100644
> --- a/northd/en-datapath-sync.c
> +++ b/northd/en-datapath-sync.c
> @@ -31,17 +31,23 @@ void *
>  en_datapath_sync_init(struct engine_node *node OVS_UNUSED,
>                        struct engine_arg *args OVS_UNUSED)
>  {
> -    struct ovn_synced_datapaths *synced_datapaths
> -        = xmalloc(sizeof *synced_datapaths);
> -    *synced_datapaths = (struct ovn_synced_datapaths) {
> -        .synced_dps = HMAP_INITIALIZER(&synced_datapaths->synced_dps),
> -        .dp_tnlids = HMAP_INITIALIZER(&synced_datapaths->dp_tnlids),
> -        .new = HMAPX_INITIALIZER(&synced_datapaths->new),
> -        .deleted = HMAPX_INITIALIZER(&synced_datapaths->deleted),
> -        .updated = HMAPX_INITIALIZER(&synced_datapaths->updated),
> +    struct all_synced_datapaths *all_dps;
> +    all_dps = xmalloc(sizeof *all_dps);
> +    *all_dps = (struct all_synced_datapaths) {
> +        .dp_tnlids = HMAP_INITIALIZER(&all_dps->dp_tnlids),
>      };
> +    for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) {
> +        struct ovn_synced_datapaths *sdps = &all_dps->synced_dps[i];
> +        *sdps = (struct ovn_synced_datapaths) {
> +            .synced_dps = HMAP_INITIALIZER(&sdps->synced_dps),
> +            .new = HMAPX_INITIALIZER(&sdps->new),
> +            .deleted = HMAPX_INITIALIZER(&sdps->deleted),
> +            .updated = HMAPX_INITIALIZER(&sdps->updated),
> +        };
> +    }
> +
>
> -    return synced_datapaths;
> +    return all_dps;
>  }
>
>  static struct ovn_unsynced_datapath *
> @@ -120,6 +126,7 @@ struct candidate_sdp {
>      struct ovn_synced_datapath *sdp;
>      uint32_t requested_tunnel_key;
>      uint32_t existing_tunnel_key;
> +    enum ovn_datapath_type dp_type;
>      bool tunnel_key_assigned;
>  };
>
> @@ -162,15 +169,19 @@ clear_tracked_data(struct ovn_synced_datapaths
> *synced_datapaths)
>  }
>
>  static void
> -reset_synced_datapaths(struct ovn_synced_datapaths *synced_datapaths)
> +reset_synced_datapaths(struct all_synced_datapaths *all_dps)
>  {
> -    struct ovn_synced_datapath *sdp;
> -    HMAP_FOR_EACH_POP (sdp, hmap_node, &synced_datapaths->synced_dps) {
> -        free(sdp);
> +    for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) {
> +        struct ovn_synced_datapaths *synced_datapaths =
> +            &all_dps->synced_dps[i];
> +        struct ovn_synced_datapath *sdp;
> +        HMAP_FOR_EACH_POP (sdp, hmap_node, &synced_datapaths->synced_dps)
> {
> +            free(sdp);
> +        }
> +        clear_tracked_data(synced_datapaths);
>      }
> -    ovn_destroy_tnlids(&synced_datapaths->dp_tnlids);
> -    clear_tracked_data(synced_datapaths);
> -    hmap_init(&synced_datapaths->dp_tnlids);
> +    ovn_destroy_tnlids(&all_dps->dp_tnlids);
> +    hmap_init(&all_dps->dp_tnlids);
>  }
>
>  static void
> @@ -200,10 +211,19 @@ create_synced_datapath_candidates_from_sb(
>              continue;
>          }
>
> +        enum ovn_datapath_type dp_type =
> +            ovn_datapath_type_from_string(datapath_get_nb_type(sb_dp));
> +
> +        if (dp_type >= DP_MAX) {
> +            sbrec_datapath_binding_delete(sb_dp);
> +            continue;
> +        }
> +
>          struct candidate_sdp candidate = {
>              .sdp = synced_datapath_alloc(udp, sb_dp, false),
>              .requested_tunnel_key = udp->requested_tunnel_key,
>              .existing_tunnel_key = sb_dp->tunnel_key,
> +            .dp_type = dp_type,
>          };
>          synced_datapath_set_sb_fields(sb_dp, udp);
>          vector_push(candidate_sdps, &candidate);
> @@ -231,6 +251,7 @@ create_synced_datapath_candidates_from_nb(
>                  .sdp = synced_datapath_alloc(udp, sb_dp, true),
>                  .requested_tunnel_key = udp->requested_tunnel_key,
>                  .existing_tunnel_key = sb_dp->tunnel_key,
> +                .dp_type = i,
>              };
>              synced_datapath_set_sb_fields(sb_dp, udp);
>              vector_push(candidate_sdps, &candidate);
> @@ -240,14 +261,14 @@ create_synced_datapath_candidates_from_nb(
>
>  static void
>  assign_requested_tunnel_keys(struct vector *candidate_sdps,
> -                             struct ovn_synced_datapaths
> *synced_datapaths)
> +                             struct all_synced_datapaths *all_dps)
>  {
>      struct candidate_sdp *candidate;
>      VECTOR_FOR_EACH_PTR (candidate_sdps, candidate) {
>          if (!candidate->requested_tunnel_key) {
>              continue;
>          }
> -        if (!ovn_add_tnlid(&synced_datapaths->dp_tnlids,
> +        if (!ovn_add_tnlid(&all_dps->dp_tnlids,
>                             candidate->requested_tunnel_key)) {
>              static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
>              VLOG_WARN_RL(&rl, "Logical datapath "UUID_FMT" requests same "
> @@ -258,7 +279,8 @@ assign_requested_tunnel_keys(struct vector
> *candidate_sdps,
>          }
>          sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp,
>
>  candidate->requested_tunnel_key);
> -        hmap_insert(&synced_datapaths->synced_dps,
> &candidate->sdp->hmap_node,
> +        hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps,
> +                    &candidate->sdp->hmap_node,
>                      uuid_hash(candidate->sdp->sb_dp->nb_uuid));
>          candidate->tunnel_key_assigned = true;
>      }
> @@ -266,7 +288,7 @@ assign_requested_tunnel_keys(struct vector
> *candidate_sdps,
>
>  static void
>  assign_existing_tunnel_keys(struct vector *candidate_sdps,
> -                            struct ovn_synced_datapaths *synced_datapaths)
> +                            struct all_synced_datapaths *all_dps)
>  {
>      struct candidate_sdp *candidate;
>      VECTOR_FOR_EACH_PTR (candidate_sdps, candidate) {
> @@ -277,9 +299,9 @@ assign_existing_tunnel_keys(struct vector
> *candidate_sdps,
>          /* Existing southbound DP. If this key is available,
>           * reuse it.
>           */
> -        if (ovn_add_tnlid(&synced_datapaths->dp_tnlids,
> +        if (ovn_add_tnlid(&all_dps->dp_tnlids,
>                            candidate->existing_tunnel_key)) {
> -            hmap_insert(&synced_datapaths->synced_dps,
> +
> hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps,
>                          &candidate->sdp->hmap_node,
>                          uuid_hash(candidate->sdp->sb_dp->nb_uuid));
>              candidate->tunnel_key_assigned = true;
> @@ -290,7 +312,7 @@ assign_existing_tunnel_keys(struct vector
> *candidate_sdps,
>  static void
>  allocate_tunnel_keys(struct vector *candidate_sdps,
>                       uint32_t max_dp_tunnel_id,
> -                     struct ovn_synced_datapaths *synced_datapaths)
> +                     struct all_synced_datapaths *all_dps)
>  {
>      uint32_t hint = 0;
>      struct candidate_sdp *candidate;
> @@ -299,7 +321,7 @@ allocate_tunnel_keys(struct vector *candidate_sdps,
>              continue;
>          }
>          uint32_t tunnel_key =
> -            ovn_allocate_tnlid(&synced_datapaths->dp_tnlids, "datapath",
> +            ovn_allocate_tnlid(&all_dps->dp_tnlids, "datapath",
>                                 OVN_MIN_DP_KEY_LOCAL,
>                                 max_dp_tunnel_id, &hint);
>          if (!tunnel_key) {
> @@ -307,7 +329,8 @@ allocate_tunnel_keys(struct vector *candidate_sdps,
>          }
>          sbrec_datapath_binding_set_tunnel_key(candidate->sdp->sb_dp,
>                                                tunnel_key);
> -        hmap_insert(&synced_datapaths->synced_dps,
> &candidate->sdp->hmap_node,
> +        hmap_insert(&all_dps->synced_dps[candidate->dp_type].synced_dps,
> +                    &candidate->sdp->hmap_node,
>                      uuid_hash(candidate->sdp->sb_dp->nb_uuid));
>          candidate->tunnel_key_assigned = true;
>      }
> @@ -330,10 +353,13 @@ static enum engine_input_handler_result
>  datapath_sync_unsynced_datapath_handler(
>          const struct ovn_unsynced_datapath_map *map,
>          const struct ed_type_global_config *global_config,
> -        struct ovsdb_idl_txn *ovnsb_idl_txn, void *data)
> +        struct ovsdb_idl_txn *ovnsb_idl_txn,
> +        enum ovn_datapath_type dp_type, void *data)
>  {
>      enum engine_input_handler_result ret = EN_HANDLED_UNCHANGED;
> -    struct ovn_synced_datapaths *synced_datapaths = data;
> +    struct all_synced_datapaths *all_dps = data;
> +    struct ovn_synced_datapaths *synced_datapaths =
> +        &all_dps->synced_dps[dp_type];
>      struct ovn_unsynced_datapath *udp;
>      struct ovn_synced_datapath *sdp;
>
> @@ -352,7 +378,7 @@ datapath_sync_unsynced_datapath_handler(
>          }
>          hmap_remove(&synced_datapaths->synced_dps, &sdp->hmap_node);
>          hmapx_add(&synced_datapaths->deleted, sdp);
> -        ovn_free_tnlid(&synced_datapaths->dp_tnlids,
> +        ovn_free_tnlid(&all_dps->dp_tnlids,
>                         sdp->sb_dp->tunnel_key);
>          sbrec_datapath_binding_delete(sdp->sb_dp);
>          ret = EN_HANDLED_UPDATED;
> @@ -368,12 +394,12 @@ datapath_sync_unsynced_datapath_handler(
>
>          if (udp->requested_tunnel_key) {
>              tunnel_key = udp->requested_tunnel_key;
> -            if (!ovn_add_tnlid(&synced_datapaths->dp_tnlids, tunnel_key))
> {
> +            if (!ovn_add_tnlid(&all_dps->dp_tnlids, tunnel_key)) {
>                  return EN_UNHANDLED;
>              }
>          } else {
>              uint32_t hint = 0;
> -            tunnel_key = ovn_allocate_tnlid(&synced_datapaths->dp_tnlids,
> +            tunnel_key = ovn_allocate_tnlid(&all_dps->dp_tnlids,
>                                              "datapath",
> OVN_MIN_DP_KEY_LOCAL,
>
>  global_config->max_dp_tunnel_id,
>                                              &hint);
> @@ -401,9 +427,8 @@ datapath_sync_unsynced_datapath_handler(
>          }
>          if (udp->requested_tunnel_key &&
>              udp->requested_tunnel_key != sdp->sb_dp->tunnel_key) {
> -            ovn_free_tnlid(&synced_datapaths->dp_tnlids,
> -                           sdp->sb_dp->tunnel_key);
> -            if (!ovn_add_tnlid(&synced_datapaths->dp_tnlids,
> +            ovn_free_tnlid(&all_dps->dp_tnlids, sdp->sb_dp->tunnel_key);
> +            if (!ovn_add_tnlid(&all_dps->dp_tnlids,
>                                 udp->requested_tunnel_key)) {
>                  return EN_UNHANDLED;
>              }
> @@ -418,6 +443,7 @@ datapath_sync_unsynced_datapath_handler(
>          ret = EN_HANDLED_UPDATED;
>      }
>
> +    all_dps->has_tracked_data = true;
>      return ret;
>  }
>
> @@ -432,6 +458,7 @@ datapath_sync_logical_switch_handler(struct
> engine_node *node, void *data)
>
>      return datapath_sync_unsynced_datapath_handler(map, global_config,
>                                                     eng_ctx->ovnsb_idl_txn,
> +                                                   DP_SWITCH,
>                                                     data);
>  }
>
> @@ -446,6 +473,7 @@ datapath_sync_logical_router_handler(struct
> engine_node *node, void *data)
>
>      return datapath_sync_unsynced_datapath_handler(map, global_config,
>                                                     eng_ctx->ovnsb_idl_txn,
> +                                                   DP_ROUTER,
>                                                     data);
>  }
>
> @@ -454,9 +482,9 @@ datapath_sync_global_config_handler(struct engine_node
> *node, void *data)
>  {
>      const struct ed_type_global_config *global_config =
>          engine_get_input_data("global_config", node);
> -    struct ovn_synced_datapaths *synced_datapaths = data;
> +    struct all_synced_datapaths *all_dps = data;
>
> -    if (synced_datapaths->vxlan_mode !=
> +    if (all_dps->vxlan_mode !=
>          global_config->vxlan_mode) {
>          /* If VXLAN mode changes, then the range of datapath tunnel IDs
>           * has completely been upended and we need to recompute.
> @@ -473,12 +501,21 @@ datapath_sync_sb_datapath_binding(struct engine_node
> *node, void *data)
>      const struct sbrec_datapath_binding_table *sb_dp_table =
>          EN_OVSDB_GET(engine_get_input("SB_datapath_binding", node));
>      enum engine_input_handler_result ret = EN_HANDLED_UNCHANGED;
> -    struct ovn_synced_datapaths *synced_datapaths = data;
> +    struct all_synced_datapaths *all_dps = data;
>
>      const struct sbrec_datapath_binding *sb_dp;
>      SBREC_DATAPATH_BINDING_TABLE_FOR_EACH_TRACKED (sb_dp, sb_dp_table) {
> +        enum ovn_datapath_type dp_type =
> +            ovn_datapath_type_from_string(datapath_get_nb_type(sb_dp));
> +        if (dp_type >= DP_MAX) {
> +            /* We have an unrecognized datapath type in the SB DB. How?
> +             * Gotta recompute and get rid of it.
> +             */
> +            return EN_UNHANDLED;
> +        }
>          struct ovn_synced_datapath *sdp =
> -            find_synced_datapath_from_sb(&synced_datapaths->synced_dps,
> sb_dp);
> +            find_synced_datapath_from_sb(
> +                    &all_dps->synced_dps[dp_type].synced_dps, sb_dp);
>          if (sbrec_datapath_binding_is_deleted(sb_dp)) {
>              if (sdp) {
>                  /* The SB datapath binding was deleted, but we still have
> a
> @@ -530,9 +567,12 @@ datapath_sync_sb_datapath_binding(struct engine_node
> *node, void *data)
>  void
>  en_datapath_sync_clear_tracked_data(void *data)
>  {
> -    struct ovn_synced_datapaths *synced_datapaths = data;
> +    struct all_synced_datapaths *all_dps = data;
>
> -    clear_tracked_data(synced_datapaths);
> +    for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) {
> +        clear_tracked_data(&all_dps->synced_dps[i]);
> +    }
> +    all_dps->has_tracked_data = false;
>  }
>
>  enum engine_node_state
> @@ -548,7 +588,7 @@ en_datapath_sync_run(struct engine_node *node , void
> *data)
>          engine_get_input_data("datapath_logical_router", node);
>
>      const struct ovn_unsynced_datapath_map *input_maps[DP_MAX];
> -    struct ovn_synced_datapaths *synced_datapaths = data;
> +    struct all_synced_datapaths *all_synced_datapaths = data;
>
>      input_maps[unsynced_ls_map->dp_type] = unsynced_ls_map;
>      input_maps[unsynced_lr_map->dp_type] = unsynced_lr_map;
> @@ -559,9 +599,9 @@ en_datapath_sync_run(struct engine_node *node , void
> *data)
>          num_datapaths += hmap_count(&input_maps[i]->dps);
>      }
>
> -    reset_synced_datapaths(synced_datapaths);
> +    reset_synced_datapaths(all_synced_datapaths);
>
> -    synced_datapaths->vxlan_mode = global_config->vxlan_mode;
> +    all_synced_datapaths->vxlan_mode = global_config->vxlan_mode;
>
>      struct uuidset visited = UUIDSET_INITIALIZER(&visited);
>      struct vector candidate_sdps =
> @@ -575,10 +615,10 @@ en_datapath_sync_run(struct engine_node *node , void
> *data)
>                                                &candidate_sdps);
>      uuidset_destroy(&visited);
>
> -    assign_requested_tunnel_keys(&candidate_sdps, synced_datapaths);
> -    assign_existing_tunnel_keys(&candidate_sdps, synced_datapaths);
> +    assign_requested_tunnel_keys(&candidate_sdps, all_synced_datapaths);
> +    assign_existing_tunnel_keys(&candidate_sdps, all_synced_datapaths);
>      allocate_tunnel_keys(&candidate_sdps, global_config->max_dp_tunnel_id,
> -                         synced_datapaths);
> +                         all_synced_datapaths);
>
>      delete_unassigned_candidates(&candidate_sdps);
>      vector_destroy(&candidate_sdps);
> @@ -586,11 +626,9 @@ en_datapath_sync_run(struct engine_node *node , void
> *data)
>      return EN_UPDATED;
>  }
>
> -void en_datapath_sync_cleanup(void *data)
> +static void
> +synced_datapaths_cleanup(struct ovn_synced_datapaths *synced_datapaths)
>  {
> -    struct ovn_synced_datapaths *synced_datapaths = data;
> -    struct ovn_synced_datapath *sdp;
> -
>      hmapx_destroy(&synced_datapaths->new);
>      hmapx_destroy(&synced_datapaths->updated);
>      struct hmapx_node *node;
> @@ -599,9 +637,19 @@ void en_datapath_sync_cleanup(void *data)
>      }
>      hmapx_destroy(&synced_datapaths->deleted);
>
> +    struct ovn_synced_datapath *sdp;
>      HMAP_FOR_EACH_POP (sdp, hmap_node, &synced_datapaths->synced_dps) {
>          free(sdp);
>      }
>      hmap_destroy(&synced_datapaths->synced_dps);
> -    ovn_destroy_tnlids(&synced_datapaths->dp_tnlids);
> +}
> +
> +void en_datapath_sync_cleanup(void *data)
> +{
> +    struct all_synced_datapaths *all_dps = data;
> +
> +    for (enum ovn_datapath_type i = DP_MIN; i < DP_MAX; i++) {
> +        synced_datapaths_cleanup(&all_dps->synced_dps[i]);
> +    }
> +    ovn_destroy_tnlids(&all_dps->dp_tnlids);
>  }
> diff --git a/northd/en-datapath-sync.h b/northd/en-datapath-sync.h
> index 0f7a85d1d..39daee505 100644
> --- a/northd/en-datapath-sync.h
> +++ b/northd/en-datapath-sync.h
> @@ -18,6 +18,14 @@
>  #define EN_DATAPATH_SYNC_H
>
>  #include "inc-proc-eng.h"
> +#include "datapath-sync.h"
> +
> +struct all_synced_datapaths {
> +    struct ovn_synced_datapaths synced_dps[DP_MAX];
> +    struct hmap dp_tnlids;
> +    bool vxlan_mode;
> +    bool has_tracked_data;
> +};
>
>  void *en_datapath_sync_init(struct engine_node *,
>                              struct engine_arg *);
> --
> 2.51.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>

Looks good to me, thanks.

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

It also seems like CI had some infra issues, let's try it again:
Recheck-request: github-robot-_Build_and_Test
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to