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