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

Reply via email to