Recheck-request: github-robot-_Build_and_Test
On 10/20/26 8:46 AM, Xavier Simonart via dev wrote:
> The 'ls_node->mmr_ext' cache lookup for a vtep logical switch's
> "unknown-dst" Mcast_Macs_Remote row was only done for non-vtep port
> bindings, not for the neighbour-VTEP loop. For logical switches with
> no local non-vtep port (e.g. one purely bridging two VTEP gateways),
> 'mmr_ext' stayed NULL, so vtep_update_mmr() always treated the row as
> new, deleting and recreating it every run instead of converging. This
> caused unbounded growth of vtep.db.
>
> Fixes: 631faf77cb0f ("vtep: Add tunnels to MACs learned from neighbour
> VTEPs.")
> Assisted-by: Claude Sonnet 5, Claude Code
> Signed-off-by: Xavier Simonart <[email protected]>
> ---
> controller-vtep/vtep.c | 38 +++++++++++++++++++++++++-------------
> 1 file changed, 25 insertions(+), 13 deletions(-)
>
> diff --git a/controller-vtep/vtep.c b/controller-vtep/vtep.c
> index 337c6d3c1..dabccd2ed 100644
> --- a/controller-vtep/vtep.c
> +++ b/controller-vtep/vtep.c
> @@ -270,6 +270,26 @@ vtep_lswitch_run(struct shash *vtep_pbs, struct sset
> *vtep_pswitches,
> sset_destroy(&used_ls);
> }
>
> +static void
> +vtep_cache_mmr_ext(struct mmr_hash_node_data **mmr_ext,
> + const struct vteprec_logical_switch *vtep_ls,
> + int64_t tnl_key, struct shash *mcast_macs_rmts)
> +{
> + if (*mmr_ext) {
> + return;
> + }
> +
> + char *mac_tnlkey = xasprintf("%s_%"PRId64, "unknown-dst", tnl_key);
> + *mmr_ext = shash_find_data(mcast_macs_rmts, mac_tnlkey);
> +
> + if (*mmr_ext && (*mmr_ext)->mmr->logical_switch == vtep_ls) {
> + /* Delete the entry from the hash table so the mmr does not get
> + * removed from the DB later on during stale checking. */
> + shash_find_and_delete(mcast_macs_rmts, mac_tnlkey);
> + }
> + free(mac_tnlkey);
> +}
> +
> /* Updates the vtep 'Ucast_Macs_Remote' and 'Mcast_Macs_Remote' tables based
> * on non-vtep port bindings. */
> static void
> @@ -405,19 +425,8 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, struct
> shash *ucast_macs_rmts,
> shash_add(&ls_node->physical_locators, chassis_ip, pl);
> }
>
> - if (!ls_node->mmr_ext) {
> - char *mac_tnlkey = xasprintf("%s_%"PRId64, "unknown-dst",
> tnl_key);
> - ls_node->mmr_ext = shash_find_data(mcast_macs_rmts, mac_tnlkey);
> -
> - if (ls_node->mmr_ext &&
> - ls_node->mmr_ext->mmr->logical_switch == ls_node->vtep_ls) {
> -
> - /* Delete the entry from the hash table so the mmr does not
> get
> - * removed from the DB later on during stale checking. */
> - shash_find_and_delete(mcast_macs_rmts, mac_tnlkey);
> - }
> - free(mac_tnlkey);
> - }
> + vtep_cache_mmr_ext(&ls_node->mmr_ext, ls_node->vtep_ls, tnl_key,
> + mcast_macs_rmts);
>
> for (i = 0; i < port_binding_rec->n_mac; i++) {
> const struct vteprec_ucast_macs_remote *umr;
> @@ -521,6 +530,9 @@ vtep_macs_run(struct ovsdb_idl_txn *vtep_idl_txn, struct
> shash *ucast_macs_rmts,
> shash_add(&ls_node->physical_locators, chassis_ip, pl);
> }
>
> + vtep_cache_mmr_ext(&ls_node->mmr_ext, ls_node->vtep_ls, tnl_key,
> + mcast_macs_rmts);
> +
> char *fdb_dp_port_key =
> xasprintf("%"PRId64"_%"PRId64,
> port_binding_rec->datapath->tunnel_key,
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev