On Wed, Aug 20, 2025 at 06:55:26PM +0200, Lorenzo Bianconi via dev wrote: > 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 > Looks good to me
Acked-by: Mairtin O'Loingsigh <moloi...@redhat.com> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev