[libvirt PATCH] virnetdevbridge: Ignore EEXIST when adding an entry to fdb

Laine Stump laine at redhat.com
Mon May 3 03:00:49 UTC 2021


On 4/30/21 12:22 PM, Jiri Denemark wrote:
> When updating entries in a bridge forwarding database (i.e., when
> macTableManager='libvirt' is configured for the bridge), we may end up
> in a situation when the entry we want to add is already present. Let's
> just ignore the error in such a case.
> 
> This fixes an error to resume a domain when fdb entries were not
> properly removed when the domain was paused:
> 
>      virsh # resume test
>      error: Failed to resume domain test
>      error: error adding fdb entry for vnet2: File exists
> 
> For some reason, fdb entries are only removed when libvirt explicitly
> stops CPUs, but nothing happens when we just get STOP event from QEMU.
> An alternative approach would be to make sure we always remove the
> entries regardless on why a domain was paused (e.g., during migration),

Yeah, somebody (/me stares off into distance while whistling) should 
look into that, since what you're doing here is just masking the root 
cause of your problem.

> but that would be a significantly more disruptive change with possible
> side effects.

Agreed, and I see no down side to what your patch does, even after we 
fix the root cause - after all, what if qemu exits while libvirtd is 
stopped? the FDB entry wouldn't get removed and your patch would end up 
being required anyway.

> 
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>

Reviewed-by: Laine Stump <laine at redhat.com>

It might be nice to mention https://bugzilla.redhat.com/1603155 (and 
also to note the commit ID of this patch in that BZ once it's pushed, as 
well as re-opening it, since it *is* being fixed).

> ---
>   src/util/virnetdevbridge.c | 10 +++++++---
>   1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/src/util/virnetdevbridge.c b/src/util/virnetdevbridge.c
> index 7b5ea4fe1d..4fe84cc162 100644
> --- a/src/util/virnetdevbridge.c
> +++ b/src/util/virnetdevbridge.c
> @@ -1063,9 +1063,13 @@ virNetDevBridgeFDBAddDel(const virMacAddr *mac, const char *ifname,
>           if (resp->nlmsg_len < NLMSG_LENGTH(sizeof(*err)))
>               goto malformed_resp;
>           if (err->error) {
> -            virReportSystemError(-err->error,
> -                                 _("error adding fdb entry for %s"), ifname);
> -            return -1;
> +            if (isAdd && -err->error == EEXIST) {
> +                VIR_DEBUG("fdb entry for %s already exists", ifname);
> +            } else {
> +                virReportSystemError(-err->error,
> +                                     _("error adding fdb entry for %s"), ifname);
> +                return -1;
> +            }
>           }
>           break;
>       case NLMSG_DONE:
> 




More information about the libvir-list mailing list