This reverts commit 482af6847f9edbcc8834ab06a7d2d14c1dbe252c.

Reported-at: 
ihttps://mail.openvswitch.org/pipermail/ovs-dev/2025-October/426727.html
Signed-off-by: Ales Musil <[email protected]>
---
 northd/en-lflow.c   |   2 +-
 northd/lflow-mgr.c  | 108 ++++++++++++++++++++------------------------
 northd/lflow-mgr.h  |  10 +---
 northd/northd.c     |   8 ++--
 tests/ovn-northd.at |  32 -------------
 5 files changed, 54 insertions(+), 106 deletions(-)

diff --git a/northd/en-lflow.c b/northd/en-lflow.c
index 84507f9e4..e80fd9f9c 100644
--- a/northd/en-lflow.c
+++ b/northd/en-lflow.c
@@ -122,7 +122,7 @@ en_lflow_run(struct engine_node *node, void *data)
     stopwatch_start(BUILD_LFLOWS_STOPWATCH_NAME, time_msec());
 
     struct lflow_data *lflow_data = data;
-    lflow_table_clear(lflow_data->lflow_table, false);
+    lflow_table_clear(lflow_data->lflow_table);
     lflow_reset_northd_refs(&lflow_input);
     lflow_ref_clear(lflow_input.igmp_lflow_ref);
 
diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c
index 5a989fe19..6a66a9718 100644
--- a/northd/lflow-mgr.c
+++ b/northd/lflow-mgr.c
@@ -26,7 +26,6 @@
 #include "lflow-mgr.h"
 #include "lib/ovn-parallel-hmap.h"
 #include "lib/ovn-util.h"
-#include "lib/uuidset.h"
 
 VLOG_DEFINE_THIS_MODULE(lflow_mgr);
 
@@ -38,8 +37,7 @@ static void ovn_lflow_init(struct ovn_lflow *, struct 
ovn_datapath *od,
                            uint16_t priority, char *match,
                            char *actions, char *io_port,
                            char *ctrl_meter, char *stage_hint,
-                           const char *where, const char *flow_desc,
-                           struct uuid sbuuid);
+                           const char *where, const char *flow_desc);
 static struct ovn_lflow *ovn_lflow_find(const struct hmap *lflows,
                                         enum ovn_stage stage,
                                         uint16_t priority, const char *match,
@@ -149,13 +147,6 @@ static struct ovs_mutex 
lflow_hash_locks[LFLOW_HASH_LOCK_MASK + 1];
  */
 extern struct ovs_mutex fake_hash_mutex;
 
-
-enum ovn_lflow_state {
-    LFLOW_STALE,
-    LFLOW_TO_SYNC,
-    LFLOW_SYNCED,
-};
-
 /* Represents a logical ovn flow (lflow).
  *
  * A logical flow with match 'M' and actions 'A' - L(M, A) is created
@@ -190,7 +181,14 @@ struct ovn_lflow {
     struct hmap dp_refcnts_map; /* Maintains the number of times this ovn_lflow
                                  * is referenced by a given datapath.
                                  * Contains 'struct dp_refcnt' in the map. */
-    enum ovn_lflow_state sync_state;
+};
+
+/* Logical flow table. */
+struct lflow_table {
+    struct hmap entries; /* hmap of lflows. */
+    struct hmap ls_dp_groups; /* hmap of logical switch dp groups. */
+    struct hmap lr_dp_groups; /* hmap of logical router dp groups. */
+    ssize_t max_seen_lflow_size;
 };
 
 struct lflow_table *
@@ -212,14 +210,10 @@ lflow_table_init(struct lflow_table *lflow_table)
 }
 
 void
-lflow_table_clear(struct lflow_table *lflow_table, bool destroy_all)
+lflow_table_clear(struct lflow_table *lflow_table)
 {
     struct ovn_lflow *lflow;
     HMAP_FOR_EACH_SAFE (lflow, hmap_node, &lflow_table->entries) {
-        if (!destroy_all) {
-            lflow->sync_state = LFLOW_STALE;
-            continue;
-        }
         ovn_lflow_destroy(lflow_table, lflow);
     }
 
@@ -230,7 +224,7 @@ lflow_table_clear(struct lflow_table *lflow_table, bool 
destroy_all)
 void
 lflow_table_destroy(struct lflow_table *lflow_table)
 {
-    lflow_table_clear(lflow_table, true);
+    lflow_table_clear(lflow_table);
     hmap_destroy(&lflow_table->entries);
     ovn_dp_groups_destroy(&lflow_table->ls_dp_groups);
     ovn_dp_groups_destroy(&lflow_table->lr_dp_groups);
@@ -263,42 +257,16 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,
                        const struct sbrec_logical_flow_table *sb_flow_table,
                        const struct sbrec_logical_dp_group_table *dpgrp_table)
 {
-    struct uuidset sb_uuid_set = UUIDSET_INITIALIZER(&sb_uuid_set);
     struct hmap lflows_temp = HMAP_INITIALIZER(&lflows_temp);
     struct hmap *lflows = &lflow_table->entries;
     struct ovn_lflow *lflow;
-    const struct sbrec_logical_flow *sbflow;
 
     fast_hmap_size_for(&lflows_temp,
                        lflow_table->max_seen_lflow_size);
 
-    HMAP_FOR_EACH_SAFE (lflow, hmap_node, lflows) {
-        if (lflow->sync_state == LFLOW_STALE) {
-            ovn_lflow_destroy(lflow_table, lflow);
-            continue;
-        }
-        sbflow = NULL;
-        if (!uuid_is_zero(&lflow->sb_uuid)) {
-            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,
-                         sbflow, dpgrp_table);
-        uuidset_insert(&sb_uuid_set, &lflow->sb_uuid);
-        hmap_remove(lflows, &lflow->hmap_node);
-        hmap_insert(&lflows_temp, &lflow->hmap_node,
-                    hmap_node_hash(&lflow->hmap_node));
-    }
     /* Push changes to the Logical_Flow table to database. */
+    const struct sbrec_logical_flow *sbflow;
     SBREC_LOGICAL_FLOW_TABLE_FOR_EACH_SAFE (sbflow, sb_flow_table) {
-        struct uuidset_node *node = uuidset_find(&sb_uuid_set,
-                                                 &sbflow->header_.uuid);
-        if (!node) {
-            sbrec_logical_flow_delete(sbflow);
-            continue;
-        }
-        uuidset_delete(&sb_uuid_set, node);
         struct sbrec_logical_dp_group *dp_group = sbflow->logical_dp_group;
         struct ovn_datapath *logical_datapath_od = NULL;
         size_t i;
@@ -329,8 +297,38 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,
             sbrec_logical_flow_delete(sbflow);
             continue;
         }
+
+        enum ovn_pipeline pipeline
+            = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT;
+
+        lflow = ovn_lflow_find(
+            lflows,
+            ovn_stage_build(ovn_datapath_get_type(logical_datapath_od),
+                            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,
+                             sbflow, dpgrp_table);
+
+            hmap_remove(lflows, &lflow->hmap_node);
+            hmap_insert(&lflows_temp, &lflow->hmap_node,
+                        hmap_node_hash(&lflow->hmap_node));
+        } else {
+            sbrec_logical_flow_delete(sbflow);
+        }
+    }
+
+    HMAP_FOR_EACH_SAFE (lflow, hmap_node, lflows) {
+        sync_lflow_to_sb(lflow, ovnsb_txn, lflow_table, ls_datapaths,
+                         lr_datapaths, ovn_internal_version_changed,
+                         NULL, dpgrp_table);
+
+        hmap_remove(lflows, &lflow->hmap_node);
+        hmap_insert(&lflows_temp, &lflow->hmap_node,
+                    hmap_node_hash(&lflow->hmap_node));
     }
-    uuidset_destroy(&sb_uuid_set);
     hmap_swap(lflows, &lflows_temp);
     hmap_destroy(&lflows_temp);
 }
@@ -849,7 +847,7 @@ ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath 
*od,
                size_t dp_bitmap_len, enum ovn_stage stage, uint16_t priority,
                char *match, char *actions, char *io_port, char *ctrl_meter,
                char *stage_hint, const char *where,
-               const char *flow_desc, struct uuid sbuuid)
+               const char *flow_desc)
 {
     lflow->dpg_bitmap = bitmap_allocate(dp_bitmap_len);
     lflow->od = od;
@@ -863,8 +861,7 @@ ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath 
*od,
     lflow->flow_desc = flow_desc;
     lflow->dpg = NULL;
     lflow->where = where;
-    lflow->sb_uuid = sbuuid;
-    lflow->sync_state = LFLOW_TO_SYNC;
+    lflow->sb_uuid = UUID_ZERO;
     hmap_init(&lflow->dp_refcnts_map);
     ovs_list_init(&lflow->referenced_by);
 }
@@ -960,18 +957,13 @@ do_ovn_lflow_add(struct lflow_table *lflow_table, size_t 
dp_bitmap_len,
 {
     struct ovn_lflow *old_lflow;
     struct ovn_lflow *lflow;
-    struct uuid sbuuid = UUID_ZERO;
 
     ovs_assert(dp_bitmap_len);
 
     old_lflow = ovn_lflow_find(&lflow_table->entries, stage,
                                priority, match, actions, ctrl_meter, hash);
     if (old_lflow) {
-        if (old_lflow->sync_state != LFLOW_STALE) {
-            return old_lflow;
-        }
-        sbuuid = old_lflow->sb_uuid;
-        ovn_lflow_destroy(lflow_table, old_lflow);
+        return old_lflow;
     }
 
     lflow = xzalloc(sizeof *lflow);
@@ -983,16 +975,14 @@ do_ovn_lflow_add(struct lflow_table *lflow_table, size_t 
dp_bitmap_len,
                    io_port ? xstrdup(io_port) : NULL,
                    nullable_xstrdup(ctrl_meter),
                    ovn_lflow_hint(stage_hint), where,
-                   flow_desc, sbuuid);
+                   flow_desc);
 
     if (parallelization_state != STATE_USE_PARALLELIZATION) {
         hmap_insert(&lflow_table->entries, &lflow->hmap_node, hash);
     } else {
         hmap_insert_fast(&lflow_table->entries, &lflow->hmap_node,
                          hash);
-        if (uuid_is_zero(&lflow->sb_uuid)) {
-            thread_lflow_counter++;
-        }
+        thread_lflow_counter++;
     }
 
     return lflow;
@@ -1160,7 +1150,6 @@ sync_lflow_to_sb(struct ovn_lflow *lflow,
                             "referencing the dp group ["UUID_FMT"]",
                             UUID_ARGS(&sbflow->header_.uuid),
                             UUID_ARGS(&lflow->dpg->dpg_uuid));
-                lflow->sync_state = LFLOW_STALE;
                 return false;
             }
         } else {
@@ -1180,7 +1169,6 @@ sync_lflow_to_sb(struct ovn_lflow *lflow,
         ovn_dp_group_release(dp_groups, pre_sync_dpg);
     }
 
-    lflow->sync_state = LFLOW_SYNCED;
     return true;
 }
 
diff --git a/northd/lflow-mgr.h b/northd/lflow-mgr.h
index 91708c8a9..1521270d6 100644
--- a/northd/lflow-mgr.h
+++ b/northd/lflow-mgr.h
@@ -26,16 +26,10 @@ struct ovn_datapath;
 struct ovsdb_idl_row;
 
 /* lflow map which stores the logical flows. */
-struct lflow_table {
-    struct hmap entries; /* hmap of lflows. */
-    struct hmap ls_dp_groups; /* hmap of logical switch dp groups. */
-    struct hmap lr_dp_groups; /* hmap of logical router dp groups. */
-    ssize_t max_seen_lflow_size;
-};
-
+struct lflow_table;
 struct lflow_table *lflow_table_alloc(void);
 void lflow_table_init(struct lflow_table *);
-void lflow_table_clear(struct lflow_table *, bool);
+void lflow_table_clear(struct lflow_table *);
 void lflow_table_destroy(struct lflow_table *);
 void lflow_table_expand(struct lflow_table *);
 void lflow_table_set_size(struct lflow_table *, size_t);
diff --git a/northd/northd.c b/northd/northd.c
index 8efbf4553..4a3463a8e 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -18850,9 +18850,9 @@ noop_callback(struct worker_pool *pool OVS_UNUSED,
 static void
 fix_flow_table_size(struct lflow_table *lflow_table,
                   struct lswitch_flow_build_info *lsiv,
-                  size_t n_lsiv, size_t start)
+                  size_t n_lsiv)
 {
-    size_t total = start;
+    size_t total = 0;
     for (size_t i = 0; i < n_lsiv; i++) {
         total += lsiv[i].thread_lflow_counter;
     }
@@ -18927,10 +18927,8 @@ build_lswitch_and_lrouter_flows(
         }
 
         /* Run thread pool. */
-        size_t current_lflow_table_size = hmap_count(&lflows->entries);
         run_pool_callback(build_lflows_pool, NULL, NULL, noop_callback);
-        fix_flow_table_size(lflows, lsiv, build_lflows_pool->size,
-                            current_lflow_table_size);
+        fix_flow_table_size(lflows, lsiv, build_lflows_pool->size);
 
         for (index = 0; index < build_lflows_pool->size; index++) {
             ds_destroy(&lsiv[index].match);
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index cded6dcd7..b1aee0008 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -12585,38 +12585,6 @@ AT_CHECK([echo $dpgrp_dps | grep $sw3_uuid], [0], 
[ignore])
 AT_CHECK([echo $dpgrp_dps | grep $sw4_uuid], [0], [ignore])
 AT_CHECK([echo $dpgrp_dps | grep $sw5_uuid], [0], [ignore])
 
-# Clear the SB:Logical_Flow.logical_dp_groups column of all the
-# logical flows and then modify the NB:Load_balancer.  ovn-northd
-# should resync the logical flows.
-for l in $(ovn-sbctl --bare --columns _uuid list logical_flow)
-do
-    check ovn-sbctl clear logical_flow $l logical_dp_group
-done
-
-check ovn-nbctl --wait=sb set load_balancer lb2 
vips='{"10.0.0.10:80"="10.0.0.3:80,10.0.0.4:80"}'
-check_engine_stats lflow recompute compute
-CHECK_NO_CHANGE_AFTER_RECOMPUTE
-
-lb_lflow_uuid=$(fetch_column Logical_flow _uuid match='"ct.new && ip4.dst == 
10.0.0.10 && reg1[[16..23]] == 6 && reg1[[0..15]] == 80"')
-AT_CHECK([test "$lb_lflow_uuid" != ""])
-
-lb_lflow_dp=$(ovn-sbctl --bare --columns logical_datapath list logical_flow 
$lb_lflow_uuid)
-AT_CHECK([test "$lb_lflow_dp" = ""])
-
-lb_lflow_dpgrp=$(ovn-sbctl --bare --columns logical_dp_group list logical_flow 
$lb_lflow_uuid)
-AT_CHECK([test "$lb_lflow_dpgrp" != ""])
-
-dpgrp_dps=$(ovn-sbctl --bare --columns datapaths list logical_dp_group 
$lb_lflow_dpgrp)
-
-echo "dpgrp dps - $dpgrp_dps"
-
-AT_CHECK([echo $dpgrp_dps | grep $sw0_uuid], [1], [ignore])
-AT_CHECK([echo $dpgrp_dps | grep $sw1_uuid], [1], [ignore])
-AT_CHECK([echo $dpgrp_dps | grep $sw2_uuid], [1], [ignore])
-AT_CHECK([echo $dpgrp_dps | grep $sw3_uuid], [0], [ignore])
-AT_CHECK([echo $dpgrp_dps | grep $sw4_uuid], [0], [ignore])
-AT_CHECK([echo $dpgrp_dps | grep $sw5_uuid], [0], [ignore])
-
 AT_CLEANUP
 ])
 
-- 
2.51.0

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

Reply via email to