Each caller of this function is aware of which set of datapaths is
relevant when syncing an lflow to the southbound database. This change
makes it so sync_lflow_to_sb() only deals with the relevant set of
datapaths for each lflow.

Signed-off-by: Mark Michelson <[email protected]>
---
 northd/lflow-mgr.c | 63 ++++++++++++++++++++++++++--------------------
 1 file changed, 36 insertions(+), 27 deletions(-)

diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c
index 26c807cf1..073edf96d 100644
--- a/northd/lflow-mgr.c
+++ b/northd/lflow-mgr.c
@@ -92,8 +92,7 @@ static bool lflow_ref_sync_lflows__(
 static bool sync_lflow_to_sb(struct ovn_lflow *,
                              struct ovsdb_idl_txn *ovnsb_txn,
                              struct lflow_table *,
-                             const struct ovn_datapaths *ls_datapaths,
-                             const struct ovn_datapaths *lr_datapaths,
+                             const struct ovn_datapaths *datapaths,
                              bool ovn_internal_version_changed,
                              const struct sbrec_logical_flow *sbflow,
                              const struct sbrec_logical_dp_group_table *);
@@ -287,8 +286,14 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,
             sbflow = sbrec_logical_flow_table_get_for_uuid(sb_flow_table,
                                                            &lflow->sb_uuid);
         }
-        sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, ls_datapaths,
-                         lr_datapaths, ovn_internal_version_changed,
+        const struct ovn_datapaths *datapaths;
+        if (ovn_stage_to_datapath_type(lflow->stage) == DP_SWITCH) {
+            datapaths = ls_datapaths;
+        } else {
+            datapaths = lr_datapaths;
+        }
+        sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, datapaths,
+                         ovn_internal_version_changed,
                          sbflow, dpgrp_table);
         uuidset_insert(&sb_uuid_set, &lflow->sb_uuid);
         hmap_remove(lflows, &lflow->hmap_node);
@@ -344,15 +349,19 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,
         enum ovn_pipeline pipeline
             = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT;
 
+        enum ovn_datapath_type dp_type
+            = ovn_datapath_get_type(logical_datapath_od);
+
         lflow = ovn_lflow_find(
             lflows,
-            ovn_stage_build(ovn_datapath_get_type(logical_datapath_od),
-                            pipeline, sbflow->table_id),
+            ovn_stage_build(dp_type, pipeline, sbflow->table_id),
             sbflow->priority, sbflow->match, sbflow->actions,
             sbflow->controller_meter, sbflow->hash);
         if (lflow) {
-            sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, ls_datapaths,
-                             lr_datapaths, ovn_internal_version_changed,
+            const struct ovn_datapaths *datapaths;
+            datapaths = dp_type == DP_SWITCH ? ls_datapaths : lr_datapaths;
+            sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, datapaths,
+                             ovn_internal_version_changed,
                              sbflow, dpgrp_table);
 
             hmap_remove(lflows, &lflow->hmap_node);
@@ -367,9 +376,14 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,
         if (search_mode != LFLOW_TABLE_SEARCH_FIELDS) {
             break;
         }
-        sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, ls_datapaths,
-                         lr_datapaths, ovn_internal_version_changed,
-                         NULL, dpgrp_table);
+        const struct ovn_datapaths *datapaths;
+        if (ovn_stage_to_datapath_type(lflow->stage) == DP_SWITCH) {
+            datapaths = ls_datapaths;
+        } else {
+            datapaths = lr_datapaths;
+        }
+        sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, datapaths,
+                         ovn_internal_version_changed, NULL, dpgrp_table);
 
         hmap_remove(lflows, &lflow->hmap_node);
         hmap_insert(&lflows_temp, &lflow->hmap_node,
@@ -1043,29 +1057,21 @@ static bool
 sync_lflow_to_sb(struct ovn_lflow *lflow,
                  struct ovsdb_idl_txn *ovnsb_txn,
                  struct lflow_table *lflow_table,
-                 const struct ovn_datapaths *ls_datapaths,
-                 const struct ovn_datapaths *lr_datapaths,
+                 const struct ovn_datapaths *datapaths,
                  bool ovn_internal_version_changed,
                  const struct sbrec_logical_flow *sbflow,
                  const struct sbrec_logical_dp_group_table *sb_dpgrp_table)
 {
     struct sbrec_logical_dp_group *sbrec_dp_group = NULL;
     struct ovn_dp_group *pre_sync_dpg = lflow->dpg;
-    struct ovn_datapath **datapaths_array;
     struct hmap *dp_groups;
     size_t n_datapaths;
-    bool is_switch;
 
+    n_datapaths = ods_size(datapaths);
     if (ovn_stage_to_datapath_type(lflow->stage) == DP_SWITCH) {
-        n_datapaths = ods_size(ls_datapaths);
-        datapaths_array = vector_get_array(&ls_datapaths->dps);
         dp_groups = &lflow_table->ls_dp_groups;
-        is_switch = true;
     } else {
-        n_datapaths = ods_size(lr_datapaths);
-        datapaths_array = vector_get_array(&lr_datapaths->dps);
         dp_groups = &lflow_table->lr_dp_groups;
-        is_switch = false;
     }
 
     size_t n_ods = dynamic_bitmap_count1(&lflow->dpg_bitmap);
@@ -1074,8 +1080,8 @@ 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);
-
-        lflow->dp = datapaths_array[index]->sdp;
+        lflow->dp =
+            vector_get(&datapaths->dps, index, struct ovn_datapath *)->sdp;
         lflow->dpg = NULL;
     } else {
         lflow->dp = NULL;
@@ -1205,7 +1211,7 @@ sync_lflow_to_sb(struct ovn_lflow *lflow,
             lflow->dpg = ovn_dp_group_create(
                                 ovnsb_txn, dp_groups, sbrec_dp_group,
                                 &lflow->dpg_bitmap,
-                                is_switch ? ls_datapaths : lr_datapaths);
+                                datapaths);
         }
         sbrec_logical_flow_set_logical_dp_group(sbflow,
                                                 lflow->dpg->dp_group);
@@ -1330,18 +1336,21 @@ lflow_ref_sync_lflows__(struct lflow_ref  *lflow_ref,
                                                   &lflow->sb_uuid);
 
         struct hmap *dp_groups = NULL;
+        const struct ovn_datapaths *datapaths;
         if (ovn_stage_to_datapath_type(lflow->stage) == DP_SWITCH) {
             dp_groups = &lflow_table->ls_dp_groups;
+            datapaths = ls_datapaths;
         } else {
             dp_groups = &lflow_table->lr_dp_groups;
+            datapaths = lr_datapaths;
         }
 
         size_t n_ods = dynamic_bitmap_count1(&lflow->dpg_bitmap);
 
         if (n_ods) {
-            if (!sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, ls_datapaths,
-                                  lr_datapaths, ovn_internal_version_changed,
-                                  sblflow, dpgrp_table)) {
+            if (!sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, datapaths,
+                                  ovn_internal_version_changed, sblflow,
+                                  dpgrp_table)) {
                 return false;
             }
         }
-- 
2.51.1

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

Reply via email to