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.

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

Reply via email to