On Tue, Jul 18, 2023 at 11:54 AM Xavier Simonart <[email protected]> wrote:
> When a port is added and deleted in the same loop by ovn-controller > this was causing the following warning > if_status|WARN|Trying to release unknown interface > We now avoid the warning in that ascenario. > > Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2222252 > Signed-off-by: Xavier Simonart <[email protected]> > --- > controller/binding.c | 12 ++++++++++-- > controller/if-status.c | 12 ++++++++++++ > controller/if-status.h | 2 ++ > tests/ofproto-macros.at | 4 ++-- > tests/ovn.at | 27 +++++++++++++++++++++++++++ > 5 files changed, 53 insertions(+), 4 deletions(-) > > diff --git a/controller/binding.c b/controller/binding.c > index f619aba2e..bc7adb048 100644 > --- a/controller/binding.c > +++ b/controller/binding.c > @@ -2682,7 +2682,13 @@ handle_deleted_lport(const struct > sbrec_port_binding *pb, > if (ld) { > remove_pb_from_local_datapath(pb, > b_ctx_out, ld); > - if_status_mgr_release_iface(b_ctx_out->if_mgr, pb->logical_port); > + /* Only try to release the port if it was ever claimed. > + * If a port was added and deleted within the same ovn-controller > loop, > + * it is seen as never claimed. > + */ > + if (if_status_is_port_claimed(b_ctx_out->if_mgr, > pb->logical_port)) { > + if_status_mgr_release_iface(b_ctx_out->if_mgr, > pb->logical_port); > + } > return; > } > > @@ -2706,7 +2712,9 @@ handle_deleted_lport(const struct sbrec_port_binding > *pb, > remove_pb_from_local_datapath(pb, b_ctx_out, > ld); > } > - if_status_mgr_release_iface(b_ctx_out->if_mgr, pb->logical_port); > + if (if_status_is_port_claimed(b_ctx_out->if_mgr, > pb->logical_port)) { > + if_status_mgr_release_iface(b_ctx_out->if_mgr, > pb->logical_port); > + } > } > } > > diff --git a/controller/if-status.c b/controller/if-status.c > index b45208746..faf4e1f67 100644 > --- a/controller/if-status.c > +++ b/controller/if-status.c > @@ -820,3 +820,15 @@ if_status_mgr_get_memory_usage(struct if_status_mgr > *mgr, > simap_increase(usage, "if_status_mgr_ifaces_state_usage-KB", > ROUND_UP(ifaces_state_usage, 1024) / 1024); > } > + > +bool > +if_status_is_port_claimed(const struct if_status_mgr *mgr, > + const char *iface_id) > +{ > + struct ovs_iface *iface = shash_find_data(&mgr->ifaces, iface_id); > + if (!iface || (iface->state > OIF_INSTALLED)) { > + return false; > + } else { > + return true; > + } > +} > diff --git a/controller/if-status.h b/controller/if-status.h > index 15624bcfa..9714f6d8d 100644 > --- a/controller/if-status.h > +++ b/controller/if-status.h > @@ -62,5 +62,7 @@ uint16_t if_status_mgr_iface_get_mtu(const struct > if_status_mgr *mgr, > const char *iface_id); > bool if_status_mgr_iface_update(const struct if_status_mgr *mgr, > const struct ovsrec_interface *iface_rec); > +bool if_status_is_port_claimed(const struct if_status_mgr *mgr, > + const char *iface_id); > > # endif /* controller/if-status.h */ > diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at > index b0101330f..07ef1d092 100644 > --- a/tests/ofproto-macros.at > +++ b/tests/ofproto-macros.at > @@ -250,11 +250,11 @@ m4_define([OVS_VSWITCHD_START], > > # check_logs scans through all *.log files (except '*.log' and > '*testsuite.log') > # and reports all WARN, ERR, EMER log entries. User can add custom sed > filters > -# in $1. > +# in $1 and select folder with $2. > m4_divert_push([PREPARE_TESTS]) > check_logs () { > local logs > - for log in *.log; do > + for log in ./$2/*.log; do > case ${log} in # ( > '*.log'|*testsuite.log) ;; # ( > *) logs="${logs} ${log}" ;; > diff --git a/tests/ovn.at b/tests/ovn.at > index f2148faac..f57e0f263 100644 > --- a/tests/ovn.at > +++ b/tests/ovn.at > @@ -36568,3 +36568,30 @@ OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos > | grep -c linux-htb) -eq 1]) > > AT_CLEANUP > ]) > + > +OVN_FOR_EACH_NORTHD([ > +AT_SETUP([Add and delete port]) > +ovn_start > + > +net_add n1 > + > +sim_add hv1 > +as hv1 > +check ovs-vsctl add-br br-phys > +ovn_attach n1 br-phys 192.168.0.11 > + > +check ovn-nbctl ls-add ls0 > +check ovn-nbctl --wait=hv lsp-add ls0 lsp1 > +as hv1 check ovs-vsctl -- add-port br-int lsp1 -- \ > + set Interface lsp1 external-ids:iface-id=lsp1 > + > +wait_for_ports_up > +sleep_controller hv1 > +check ovn-nbctl --wait=sb lsp-add ls0 lsp0 > +check ovn-nbctl --wait=sb lsp-del lsp0 > +wake_up_controller hv1 > +AT_CHECK([check_logs [""] hv1]) > +OVN_CLEANUP([hv1]) > + > +AT_CLEANUP > +]) > -- > 2.31.1 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > Looks good to me, thanks. Acked-by: Ales Musil <[email protected]> -- Ales Musil Senior Software Engineer - OVN Core Red Hat EMEA <https://www.redhat.com> [email protected] IM: amusil <https://red.ht/sig> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
