When binding an OVS interface to a logical port, if external_ids:iface-id is set within the same transaction as adding the interface to a bridge, ovn-controller is usually initially notified of ovs interface change with ofport == 0. If the lport was already bound to a different interface, the ofport=0 notification caused an unexpected release of the interface.
Signed-off-by: Xavier Simonart <[email protected]> --- controller/binding.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/controller/binding.c b/controller/binding.c index a50379895..db1eb7a40 100644 --- a/controller/binding.c +++ b/controller/binding.c @@ -2233,6 +2233,23 @@ consider_iface_release(const struct ovsrec_interface *iface_rec, struct shash *binding_lports = &b_ctx_out->lbinding_data->lports; lbinding = local_binding_find(local_bindings, iface_id); + + if (lbinding) { + int64_t ofport = iface_rec->n_ofport ? *iface_rec->ofport : 0; + if (lbinding->iface != iface_rec && !ofport) { + /* If external_ids:iface-id is set within the same transaction + * as adding an interface to a bridge, ovn-controller is + * usually initially notified of ovs interface changes with + * ofport == 0. If the lport was bound to a different interface + * we do not want to release it. + */ + VLOG_DBG("Not releasing lport %s as %s was claimed " + "and %s was never bound)", iface_id, lbinding->iface ? + lbinding->iface->name : "", iface_rec->name); + return true; + } + } + struct binding_lport *b_lport = local_binding_get_primary_or_localport_lport(lbinding); if (is_binding_lport_this_chassis(b_lport, b_ctx_in->chassis_rec)) { -- 2.31.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
