On Thu, Aug 18, 2022 at 5:21 PM Han Zhou <hz...@ovn.org> wrote:
>
> When handling port_binding changes, it is possible that new
> local_datapaths are added, and the fields of the local_datapath, such as
> localnet_port, external_ports, etc. need to be updated for the newly
> added local_datapaths.
>
> This problem doesn't happen in most cases because the changes that
> trigger the new local_datapath addition usually trigger recomputes,
> but it may not always be the case. If recompute is not triggered,
> local_datapaths are not properly updated and will result in missing OVS
> flows. This is more likely to happen when we delay patch interface
> deletion in the future, or if we implement patch interface I-P.
>
> Signed-off-by: Han Zhou <hz...@ovn.org>
> ---
>  controller/binding.c | 37 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)
>
> diff --git a/controller/binding.c b/controller/binding.c
> index efb747d52..9f04e6f35 100644
> --- a/controller/binding.c
> +++ b/controller/binding.c
> @@ -2850,6 +2850,43 @@ delete_done:
>      sset_destroy(&postponed_ports);
>      cleanup_claimed_port_timestamps();
>
> +    if (handled) {
> +        /* There may be new local datapaths added by the above handling,
so go
> +         * through each port_binding of newly added local datapaths to
update
> +         * related local_datapaths if needed. */
> +        struct shash bridge_mappings =
> +            SHASH_INITIALIZER(&bridge_mappings);
> +        add_ovs_bridge_mappings(b_ctx_in->ovs_table,
> +                                b_ctx_in->bridge_table,
> +                                &bridge_mappings);
> +        struct tracked_datapath *t_dp;
> +        HMAP_FOR_EACH (t_dp, node, b_ctx_out->tracked_dp_bindings) {
> +            if (t_dp->tracked_type != TRACKED_RESOURCE_NEW) {
> +                continue;
> +            }
> +            struct sbrec_port_binding *target =
> +                sbrec_port_binding_index_init_row(
> +                    b_ctx_in->sbrec_port_binding_by_datapath);
> +            sbrec_port_binding_index_set_datapath(target, t_dp->dp);
> +
> +            SBREC_PORT_BINDING_FOR_EACH_EQUAL (pb, target,
> +                b_ctx_in->sbrec_port_binding_by_datapath) {
> +                enum en_lport_type lport_type = get_lport_type(pb);
> +                if (lport_type == LP_LOCALNET) {
> +                    update_ld_localnet_port(pb, &bridge_mappings,
> +                                            b_ctx_out->egress_ifaces,
> +                                            b_ctx_out->local_datapaths);
> +                } else if (lport_type == LP_EXTERNAL) {
> +                    update_ld_external_ports(pb,
b_ctx_out->local_datapaths);
> +                } else if (pb->n_additional_chassis) {
> +                    update_ld_multichassis_ports(pb,
> +
b_ctx_out->local_datapaths);
> +                }
> +            }
> +        }
> +        shash_destroy(&bridge_mappings);
> +    }
> +
>      if (handled && qos_map_ptr && set_noop_qos(b_ctx_in->ovs_idl_txn,
>                                                 b_ctx_in->port_table,
>                                                 b_ctx_in->qos_table,
> --
> 2.30.2
>

Oops, I missed destroying the index row. Please consider below incremental
patch:
----- 8><
------------------------------------------------------------------------><8
----
diff --git a/controller/binding.c b/controller/binding.c
index 9f04e6f35..beb5c8e17 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -2883,6 +2883,7 @@ delete_done:

b_ctx_out->local_datapaths);
                 }
             }
+            sbrec_port_binding_index_destroy_row(target);
         }
         shash_destroy(&bridge_mappings);
     }
------------------------------------------------------------------------------------------------
Sorry for the mistake!

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

Reply via email to