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

Reply via email to