On Fri, Jun 2, 2023 at 7:56 AM Numan Siddique <[email protected]> wrote:
>
> On Fri, Jun 2, 2023 at 12:12 AM Han Zhou <[email protected]> wrote:
> >
> > This patch ensures logical flows remain persistent between engine runs,
> > given there are no changes. In case of any change, it will deconstruct
> > and reconstruct the hmap during recompute. This functionality is needed
> > for future incremental processing, particularly when logical flows need
> > to be removed.
> >
> > Signed-off-by: Han Zhou <[email protected]>
> > Reviewed-by: Ales Musil <[email protected]>
>
> Acked-by: Numan Siddique <[email protected]>
>
> Numan
Thanks Numan. I applied to main.
Han
>
> > ---
> > northd/en-lflow.c | 16 ++++++++++----
> > northd/northd.c | 55 +++++++++++++++++++++++++++++++----------------
> > northd/northd.h | 13 +++++++++--
> > ovs | 2 +-
> > 4 files changed, 61 insertions(+), 25 deletions(-)
> >
> > diff --git a/northd/en-lflow.c b/northd/en-lflow.c
> > index bed7bb001e20..081ec7c353ed 100644
> > --- a/northd/en-lflow.c
> > +++ b/northd/en-lflow.c
> > @@ -30,7 +30,7 @@
> >
> > VLOG_DEFINE_THIS_MODULE(en_lflow);
> >
> > -void en_lflow_run(struct engine_node *node, void *data OVS_UNUSED)
> > +void en_lflow_run(struct engine_node *node, void *data)
> > {
> > const struct engine_context *eng_ctx = engine_get_context();
> >
> > @@ -68,13 +68,17 @@ void en_lflow_run(struct engine_node *node, void
*data OVS_UNUSED)
> > lflow_input.ovn_internal_version_changed =
> > northd_data->ovn_internal_version_changed;
> >
> > + struct lflow_data *lflow_data = data;
> > + lflow_data_destroy(lflow_data);
> > + lflow_data_init(lflow_data);
> > +
> > stopwatch_start(BUILD_LFLOWS_STOPWATCH_NAME, time_msec());
> > build_bfd_table(eng_ctx->ovnsb_idl_txn,
> > lflow_input.nbrec_bfd_table,
> > lflow_input.sbrec_bfd_table,
> > &bfd_connections,
> > &northd_data->lr_ports);
> > - build_lflows(&lflow_input, eng_ctx->ovnsb_idl_txn);
> > + build_lflows(eng_ctx->ovnsb_idl_txn, &lflow_input,
&lflow_data->lflows);
> > bfd_cleanup_connections(lflow_input.nbrec_bfd_table,
> > &bfd_connections);
> > hmap_destroy(&bfd_connections);
> > @@ -82,12 +86,16 @@ void en_lflow_run(struct engine_node *node, void
*data OVS_UNUSED)
> >
> > engine_set_node_state(node, EN_UPDATED);
> > }
> > +
> > void *en_lflow_init(struct engine_node *node OVS_UNUSED,
> > struct engine_arg *arg OVS_UNUSED)
> > {
> > - return NULL;
> > + struct lflow_data *data = xmalloc(sizeof *data);
> > + lflow_data_init(data);
> > + return data;
> > }
> >
> > -void en_lflow_cleanup(void *data OVS_UNUSED)
> > +void en_lflow_cleanup(void *data)
> > {
> > + lflow_data_destroy(data);
> > }
> > diff --git a/northd/northd.c b/northd/northd.c
> > index 277f4780bd20..93f126aa32b4 100644
> > --- a/northd/northd.c
> > +++ b/northd/northd.c
> > @@ -15250,6 +15250,22 @@ build_lswitch_and_lrouter_flows(const struct
ovn_datapaths *ls_datapaths,
> >
> > static ssize_t max_seen_lflow_size = 128;
> >
> > +void
> > +lflow_data_init(struct lflow_data *data)
> > +{
> > + fast_hmap_size_for(&data->lflows, max_seen_lflow_size);
> > +}
> > +
> > +void
> > +lflow_data_destroy(struct lflow_data *data)
> > +{
> > + struct ovn_lflow *lflow;
> > + HMAP_FOR_EACH_SAFE (lflow, hmap_node, &data->lflows) {
> > + ovn_lflow_destroy(&data->lflows, lflow);
> > + }
> > + hmap_destroy(&data->lflows);
> > +}
> > +
> > void run_update_worker_pool(int n_threads)
> > {
> > /* If number of threads has been updated (or initially set),
> > @@ -15279,10 +15295,10 @@ build_mcast_groups(const struct
sbrec_igmp_group_table *sbrec_igmp_group_table,
> >
> > /* Updates the Logical_Flow and Multicast_Group tables in the OVN_SB
database,
> > * constructing their contents based on the OVN_NB database. */
> > -void build_lflows(struct lflow_input *input_data,
> > - struct ovsdb_idl_txn *ovnsb_txn)
> > +void build_lflows(struct ovsdb_idl_txn *ovnsb_txn,
> > + struct lflow_input *input_data,
> > + struct hmap *lflows)
> > {
> > - struct hmap lflows;
> > struct hmap mcast_groups;
> > struct hmap igmp_groups;
> >
> > @@ -15292,13 +15308,11 @@ void build_lflows(struct lflow_input
*input_data,
> > input_data->ls_ports, input_data->lr_ports,
> > &mcast_groups, &igmp_groups);
> >
> > - fast_hmap_size_for(&lflows, max_seen_lflow_size);
> > -
> > build_lswitch_and_lrouter_flows(input_data->ls_datapaths,
> > input_data->lr_datapaths,
> > input_data->ls_ports,
> > input_data->lr_ports,
> > - input_data->port_groups, &lflows,
> > + input_data->port_groups, lflows,
> > &mcast_groups, &igmp_groups,
> > input_data->meter_groups,
input_data->lbs,
> > input_data->bfd_connections,
> > @@ -15311,10 +15325,10 @@ void build_lflows(struct lflow_input
*input_data,
> > /* Parallel build may result in a suboptimal hash. Resize the
> > * hash to a correct size before doing lookups */
> >
> > - hmap_expand(&lflows);
> > + hmap_expand(lflows);
> >
> > - if (hmap_count(&lflows) > max_seen_lflow_size) {
> > - max_seen_lflow_size = hmap_count(&lflows);
> > + if (hmap_count(lflows) > max_seen_lflow_size) {
> > + max_seen_lflow_size = hmap_count(lflows);
> > }
> >
> > stopwatch_start(LFLOWS_DP_GROUPS_STOPWATCH_NAME, time_msec());
> > @@ -15332,7 +15346,7 @@ void build_lflows(struct lflow_input
*input_data,
> > fast_hmap_size_for(&single_dp_lflows, max_seen_lflow_size);
> >
> > struct ovn_lflow *lflow;
> > - HMAP_FOR_EACH_SAFE (lflow, hmap_node, &lflows) {
> > + HMAP_FOR_EACH_SAFE (lflow, hmap_node, lflows) {
> > struct ovn_datapath **datapaths_array;
> > size_t n_datapaths;
> >
> > @@ -15360,7 +15374,7 @@ void build_lflows(struct lflow_input
*input_data,
> > /* Logical flow should be re-hashed to allow lookups. */
> > uint32_t hash = hmap_node_hash(&lflow->hmap_node);
> > /* Remove from lflows. */
> > - hmap_remove(&lflows, &lflow->hmap_node);
> > + hmap_remove(lflows, &lflow->hmap_node);
> > hash =
ovn_logical_flow_hash_datapath(&lflow->od->sb->header_.uuid,
> > hash);
> > /* Add to single_dp_lflows. */
> > @@ -15370,13 +15384,14 @@ void build_lflows(struct lflow_input
*input_data,
> >
> > /* Merge multiple and single dp hashes. */
> >
> > - fast_hmap_merge(&lflows, &single_dp_lflows);
> > + fast_hmap_merge(lflows, &single_dp_lflows);
> >
> > hmap_destroy(&single_dp_lflows);
> >
> > stopwatch_stop(LFLOWS_DP_GROUPS_STOPWATCH_NAME, time_msec());
> > stopwatch_start(LFLOWS_TO_SB_STOPWATCH_NAME, time_msec());
> >
> > + struct hmap lflows_temp = HMAP_INITIALIZER(&lflows_temp);
> > /* Push changes to the Logical_Flow table to database. */
> > const struct sbrec_logical_flow *sbflow;
> > SBREC_LOGICAL_FLOW_TABLE_FOR_EACH_SAFE (sbflow,
> > @@ -15419,7 +15434,7 @@ void build_lflows(struct lflow_input
*input_data,
> > = !strcmp(sbflow->pipeline, "ingress") ? P_IN : P_OUT;
> >
> > lflow = ovn_lflow_find(
> > - &lflows, dp_group ? NULL : logical_datapath_od,
> > + lflows, dp_group ? NULL : logical_datapath_od,
> > ovn_stage_build(ovn_datapath_get_type(logical_datapath_od),
> > pipeline, sbflow->table_id),
> > sbflow->priority, sbflow->match, sbflow->actions,
> > @@ -15480,13 +15495,15 @@ void build_lflows(struct lflow_input
*input_data,
> > }
> >
> > /* This lflow updated. Not needed anymore. */
> > - ovn_lflow_destroy(&lflows, lflow);
> > + 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) {
> > + HMAP_FOR_EACH_SAFE (lflow, hmap_node, lflows) {
> > const char *pipeline =
ovn_stage_get_pipeline_name(lflow->stage);
> > uint8_t table = ovn_stage_get_table(lflow->stage);
> > struct hmap *dp_groups;
> > @@ -15550,10 +15567,12 @@ void build_lflows(struct lflow_input
*input_data,
> > }
> > sbrec_logical_flow_set_external_ids(sbflow, &ids);
> > smap_destroy(&ids);
> > -
> > - ovn_lflow_destroy(&lflows, lflow);
> > + hmap_remove(lflows, &lflow->hmap_node);
> > + hmap_insert(&lflows_temp, &lflow->hmap_node,
> > + hmap_node_hash(&lflow->hmap_node));
> > }
> > - hmap_destroy(&lflows);
> > + hmap_swap(lflows, &lflows_temp);
> > + hmap_destroy(&lflows_temp);
> >
> > stopwatch_stop(LFLOWS_TO_SB_STOPWATCH_NAME, time_msec());
> > struct ovn_dp_group *dpg;
> > diff --git a/northd/northd.h b/northd/northd.h
> > index f073ceb6d9c2..edccb0ca89c0 100644
> > --- a/northd/northd.h
> > +++ b/northd/northd.h
> > @@ -99,6 +99,13 @@ struct northd_data {
> > struct chassis_features features;
> > };
> >
> > +struct lflow_data {
> > + struct hmap lflows;
> > +};
> > +
> > +void lflow_data_init(struct lflow_data *);
> > +void lflow_data_destroy(struct lflow_data *);
> > +
> > struct lflow_input {
> > /* Northbound table references */
> > const struct nbrec_bfd_table *nbrec_bfd_table;
> > @@ -295,8 +302,10 @@ void northd_destroy(struct northd_data *data);
> > void northd_init(struct northd_data *data);
> > void northd_indices_create(struct northd_data *data,
> > struct ovsdb_idl *ovnsb_idl);
> > -void build_lflows(struct lflow_input *input_data,
> > - struct ovsdb_idl_txn *ovnsb_txn);
> > +void build_lflows(struct ovsdb_idl_txn *ovnsb_txn,
> > + struct lflow_input *input_data,
> > + struct hmap *lflows);
> > +
> > void build_bfd_table(struct ovsdb_idl_txn *ovnsb_txn,
> > const struct nbrec_bfd_table *,
> > const struct sbrec_bfd_table *,
> > diff --git a/ovs b/ovs
> > index 0187eadfce45..b72a7f92573a 160000
> > --- a/ovs
> > +++ b/ovs
> > @@ -1 +1 @@
> > -Subproject commit 0187eadfce4505d502e57c0e688b830f0a1ec728
> > +Subproject commit b72a7f92573aa4e6205e57cb978532b4c04702e1
> > --
> > 2.30.2
> >
> > _______________________________________________
> > dev mailing list
> > [email protected]
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev