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

Reply via email to