Hi Ales, Rosemarie Thanks for the patch. The patch itself fixes the north issue causing a continuous insert/delete conflict between ovn-controller-vtep and ovn-northd. However, a similar issue (a continuous insert/delete loop) also exists, in some cases, with controller-vtep alone. Since this might be considered a different issue, I'll give an Ack and will send a vtep-related patch and some tests highlighting the issue later today.
Acked-by: Xavier Simonart <[email protected]> Thanks Xavier On Mon, Oct 19, 2026 at 9:38 PM Rosemarie O'Riorden via dev < [email protected]> wrote: > Thank you Ales! > > Acked-by: Rosemarie O'Riorden <[email protected]> > > On 10/19/26 3:25 PM, Ales Musil via dev wrote: > > Do not attempt to remove FDB learned via VTEP LSP with no address, > > otherwise we end up in a loop where the FDBs are learned through VTEP > > and removed right away. > > > > Fixes: 03fd372c879b ("northd: Properly cleanup FDB entries.") > > Signed-off-by: Ales Musil <[email protected]> > > --- > > northd/northd.c | 13 +++++++++---- > > tests/ovn-controller-vtep.at | 7 +++++++ > > 2 files changed, 16 insertions(+), 4 deletions(-) > > > > diff --git a/northd/northd.c b/northd/northd.c > > index 7c4cb5a62..27683fdd4 100644 > > --- a/northd/northd.c > > +++ b/northd/northd.c > > @@ -1314,6 +1314,13 @@ lsp_disable_arp_nd_rsp(const struct > nbrec_logical_switch_port *nbsp) > > return smap_get_bool( ->options, "disable_arp_nd_rsp", false); > > } > > > > +static bool > > +port_can_learn_fdb(const struct ovn_port *op) > > +{ > > + return op->nbsp && lsp_is_enabled(op->nbsp) && > > + (op->has_unknown || lsp_is_vtep(op->nbsp)); > > + } > > + > > static bool > > lsp_is_type_changed(const struct sbrec_port_binding *sb, > > const struct nbrec_logical_switch_port *nbsp, > > @@ -4367,9 +4374,7 @@ ovn_port_add_tnlid(struct ovn_port *op, uint32_t > tunnel_key) > > op->od->port_key_hint = tunnel_key; > > } > > > > - /* Track the assigned tunnel_key for enabled LSP > > - * with unknown address. */ > > - if (op->nbsp && lsp_is_enabled(op->nbsp) && op->has_unknown) { > > + if (port_can_learn_fdb(op)) { > > ovs_assert(ovn_add_tnlid(&op->od->fdb_ports_tnlids, > tunnel_key)); > > } > > } > > @@ -4425,7 +4430,7 @@ ovn_port_allocate_key(struct ovn_port *op) > > return false; > > } > > > > - if (op->nbsp && lsp_is_enabled(op->nbsp) && op->has_unknown) { > > + if (port_can_learn_fdb(op)) { > > ovs_assert(ovn_add_tnlid(&op->od->fdb_ports_tnlids, > > op->tunnel_key)); > > } > > diff --git a/tests/ovn-controller-vtep.at b/tests/ovn-controller-vtep.at > > index 0e8a1e008..aa8da62a6 100644 > > --- a/tests/ovn-controller-vtep.at > > +++ b/tests/ovn-controller-vtep.at > > @@ -620,7 +620,11 @@ OVS_WAIT_UNTIL([vtep-ctl list Ucast_Macs_Local | > grep -q aa:bb:cc:dd:ff:02]) > > > > # Check that first MACs is propagated to FDB table > > wait_row_count fdb 1 mac='"aa:bb:cc:dd:ff:01"' > > +uuid1=$(fetch_column fdb _uuid mac='"aa:bb:cc:dd:ff:01"') > > +check test -n "$uuid1" > > wait_row_count fdb 1 mac='"aa:bb:cc:dd:ff:02"' > > +uuid2=$(fetch_column fdb _uuid mac='"aa:bb:cc:dd:ff:02"') > > +check test -n "$uuid2" > > > > # Switch context > > as > > @@ -632,6 +636,9 @@ OVS_WAIT_WHILE([vtep-ctl list-remote-macs lswitch1 | > grep -q aa:bb:cc:dd:ff:01]) > > OVS_WAIT_UNTIL([vtep-ctl list-remote-macs lswitch1 | grep -q > aa:bb:cc:dd:ff:02]) > > OVS_WAIT_WHILE([vtep-ctl list-remote-macs lswitch0 | grep -q > aa:bb:cc:dd:ff:02]) > > > > +check test "$uuid1" = "$(fetch_column fdb _uuid > mac='"aa:bb:cc:dd:ff:01"')" > > +check test "$uuid2" = "$(fetch_column fdb _uuid > mac='"aa:bb:cc:dd:ff:02"')" > > + > > # Switch context to br-vtep1 > > as br-vtep1 > > > > _______________________________________________ > 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
