From: Numan Siddique <num...@ovn.org>

en_northd engine nodes provides the created or updated logical switches
in its tracked data and en_ls_stateful node handles these changes.

Acked-by: Mark Michelson <mmich...@redhat.com>
Signed-off-by: Numan Siddique <num...@ovn.org>
---
 northd/en-ls-stateful.c | 49 +++++++++++++++++++++++++++++++++++------
 northd/en-ls-stateful.h |  4 +++-
 northd/northd.c         | 11 +++++++++
 tests/ovn-northd.at     |  4 ++--
 4 files changed, 58 insertions(+), 10 deletions(-)

diff --git a/northd/en-ls-stateful.c b/northd/en-ls-stateful.c
index 1711d38e7..a9a685504 100644
--- a/northd/en-ls-stateful.c
+++ b/northd/en-ls-stateful.c
@@ -88,6 +88,7 @@ en_ls_stateful_init(struct engine_node *node OVS_UNUSED,
     struct ed_type_ls_stateful *data = xzalloc(sizeof *data);
     ls_stateful_table_init(&data->table);
     hmapx_init(&data->trk_data.crupdated);
+    hmapx_init(&data->trk_data.deleted);
     return data;
 }
 
@@ -97,6 +98,13 @@ en_ls_stateful_cleanup(void *data_)
     struct ed_type_ls_stateful *data = data_;
     ls_stateful_table_destroy(&data->table);
     hmapx_destroy(&data->trk_data.crupdated);
+
+    struct hmapx_node *n;
+    HMAPX_FOR_EACH_SAFE (n, &data->trk_data.deleted) {
+        ls_stateful_record_destroy(n->data);
+        hmapx_delete(&data->trk_data.deleted, n);
+    }
+    hmapx_destroy(&data->trk_data.deleted);
 }
 
 void
@@ -104,6 +112,13 @@ en_ls_stateful_clear_tracked_data(void *data_)
 {
     struct ed_type_ls_stateful *data = data_;
     hmapx_clear(&data->trk_data.crupdated);
+
+    struct hmapx_node *n;
+    HMAPX_FOR_EACH_SAFE (n, &data->trk_data.deleted) {
+        ls_stateful_record_destroy(n->data);
+        hmapx_delete(&data->trk_data.deleted, n);
+    }
+    hmapx_clear(&data->trk_data.deleted);
 }
 
 enum engine_node_state
@@ -131,12 +146,9 @@ ls_stateful_northd_handler(struct engine_node *node, void 
*data_)
         return EN_UNHANDLED;
     }
 
-    if (northd_has_lswitches_in_tracked_data(&northd_data->trk_data)) {
-        return EN_UNHANDLED;
-    }
-
     if (!northd_has_ls_lbs_in_tracked_data(&northd_data->trk_data) &&
-        !northd_has_ls_acls_in_tracked_data(&northd_data->trk_data)) {
+        !northd_has_ls_acls_in_tracked_data(&northd_data->trk_data) &&
+        !northd_has_lswitches_in_tracked_data(&northd_data->trk_data)) {
         return EN_HANDLED_UNCHANGED;
     }
 
@@ -145,6 +157,15 @@ ls_stateful_northd_handler(struct engine_node *node, void 
*data_)
     struct ed_type_ls_stateful *data = data_;
     struct hmapx_node *hmapx_node;
 
+    HMAPX_FOR_EACH (hmapx_node, &nd_changes->trk_switches.crupdated) {
+        const struct ovn_datapath *od = hmapx_node->data;
+
+        if (!ls_stateful_table_find_(&data->table, od->nbs)) {
+            ls_stateful_record_create(&data->table, od,
+                                      input_data.ls_port_groups);
+        }
+    }
+
     HMAPX_FOR_EACH (hmapx_node, &nd_changes->ls_with_changed_lbs) {
         const struct ovn_datapath *od = hmapx_node->data;
 
@@ -172,6 +193,20 @@ ls_stateful_northd_handler(struct engine_node *node, void 
*data_)
         }
     }
 
+    HMAPX_FOR_EACH (hmapx_node, &nd_changes->trk_switches.deleted) {
+        const struct ovn_datapath *od = hmapx_node->data;
+        struct ls_stateful_record *ls_stateful_rec =
+            ls_stateful_table_find_(&data->table, od->nbs);
+
+        if (ls_stateful_rec &&
+            !ovn_datapath_find(&northd_data->ls_datapaths.datapaths,
+                               &od->nbs->header_.uuid)) {
+            hmap_remove(&data->table.entries, &ls_stateful_rec->key_node);
+            /* Add the ls_stateful_rec to the tracking data. */
+            hmapx_add(&data->trk_data.deleted, ls_stateful_rec);
+        }
+    }
+
     if (ls_stateful_has_tracked_data(&data->trk_data)) {
         return EN_HANDLED_UPDATED;
     }
@@ -191,11 +226,11 @@ ls_stateful_port_group_handler(struct engine_node *node, 
void *data_)
         const struct nbrec_logical_switch *nbs = hmap_node->data;
         struct ls_stateful_record *ls_stateful_rec =
             ls_stateful_table_find_(&data->table, nbs);
-        ovs_assert(ls_stateful_rec);
         /* Ensure that only one handler per engine run calls
          * ls_stateful_record_set_acls on the same ls_stateful_rec by
          * calling it only when the ls_stateful_rec is added to the hmapx.*/
-        if (hmapx_add(&data->trk_data.crupdated, ls_stateful_rec)) {
+        if (ls_stateful_rec && hmapx_add(&data->trk_data.crupdated,
+                                         ls_stateful_rec)) {
             ls_stateful_record_set_acls(ls_stateful_rec,
                                         nbs,
                                         &pg_data->ls_port_groups);
diff --git a/northd/en-ls-stateful.h b/northd/en-ls-stateful.h
index 217adf696..ffc0f4269 100644
--- a/northd/en-ls-stateful.h
+++ b/northd/en-ls-stateful.h
@@ -97,6 +97,7 @@ struct ls_stateful_table {
 struct ls_stateful_tracked_data {
     /* Created or updated logical switch with LB and ACL data. */
     struct hmapx crupdated; /* Stores 'struct ls_stateful_record'. */
+    struct hmapx deleted;
 };
 
 struct ed_type_ls_stateful {
@@ -121,7 +122,8 @@ const struct ls_stateful_record *ls_stateful_table_find(
 
 static inline bool
 ls_stateful_has_tracked_data(struct ls_stateful_tracked_data *trk_data) {
-    return !hmapx_is_empty(&trk_data->crupdated);
+    return !hmapx_is_empty(&trk_data->crupdated) ||
+           !hmapx_is_empty(&trk_data->deleted);
 }
 
 #endif /* EN_LS_STATEFUL_H */
diff --git a/northd/northd.c b/northd/northd.c
index ace5c2301..05b1a2745 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -18751,6 +18751,17 @@ lflow_handle_ls_stateful_changes(struct ovsdb_idl_txn 
*ovnsb_txn,
         }
     }
 
+    HMAPX_FOR_EACH (hmapx_node, &trk_data->deleted) {
+        struct ls_stateful_record *ls_stateful_rec = hmapx_node->data;
+        const struct ovn_datapath *od =
+            ovn_datapaths_find_by_index(lflow_input->ls_datapaths,
+                                        ls_stateful_rec->ls_index);
+        ovs_assert(od->nbs && uuid_equals(&od->nbs->header_.uuid,
+                                          &ls_stateful_rec->nbs_uuid));
+
+        lflow_ref_unlink_lflows(ls_stateful_rec->lflow_ref);
+    }
+
     return true;
 }
 
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 9e0e80418..c6cc4eeb9 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -14552,7 +14552,7 @@ ovn_start
 check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats
 check ovn-nbctl --wait=sb ls-add sw0
 check_engine_stats northd norecompute compute
-check_engine_stats ls_stateful recompute nocompute
+check_engine_stats ls_stateful norecompute compute
 check_engine_stats lflow recompute nocompute
 
 # For the below engine nodes, en_northd is input.  So check
@@ -14590,7 +14590,7 @@ check ovn-nbctl --wait=sb lsp-add sw0 lsp0
 check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats
 check ovn-nbctl --wait=sb ls-del sw0
 check_engine_stats northd norecompute compute
-check_engine_stats ls_stateful recompute nocompute
+check_engine_stats ls_stateful norecompute compute
 check_engine_stats lflow recompute nocompute
 
 # For the below engine nodes, en_northd is input.  So check
-- 
2.50.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to