From patchwork Thu Oct 19 02:37:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Pattrick X-Patchwork-Id: 1851387 X-Patchwork-Delegate: echaudro@redhat.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=G+nfo+u8; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4S9sLm5mVBz20cx for ; Thu, 19 Oct 2023 13:37:20 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id B57986FA41; Thu, 19 Oct 2023 02:37:18 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org B57986FA41 Authentication-Results: smtp3.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=G+nfo+u8 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id HIcEallNmhoT; Thu, 19 Oct 2023 02:37:16 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp3.osuosl.org (Postfix) with ESMTPS id 59D366FA3F; Thu, 19 Oct 2023 02:37:15 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 59D366FA3F Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 31CC3C0071; Thu, 19 Oct 2023 02:37:15 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5D2BFC0032 for ; Thu, 19 Oct 2023 02:37:13 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 4499B41A2E for ; Thu, 19 Oct 2023 02:37:13 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 4499B41A2E Authentication-Results: smtp2.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=G+nfo+u8 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id cDlsf1brL4ji for ; Thu, 19 Oct 2023 02:37:11 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by smtp2.osuosl.org (Postfix) with ESMTPS id 4F466403E0 for ; Thu, 19 Oct 2023 02:37:11 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 4F466403E0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1697683030; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=9up8umX5FZQriifXOcfi6hSDT700xCUO9IllNbDi/tk=; b=G+nfo+u8W4GzxwAEMJJioyG9ZBF2YOQ+tOwzH0SMT+CvD/88tZ0/2NtD9pU8L36v0RYYMU zmy1XTIFxwUvM42IstZ0y4+J0dHS0xNZNHsvWGApVNeIXa+/4WpFK8EGQ8t4PihgV4Pps/ FPLpJyHyfvd3Yz8jVkmDquiRoap2QZc= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-372-iVV6xKAdOAKW0xGM-edwJw-1; Wed, 18 Oct 2023 22:37:09 -0400 X-MC-Unique: iVV6xKAdOAKW0xGM-edwJw-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DFB3029AB435 for ; Thu, 19 Oct 2023 02:37:07 +0000 (UTC) Received: from mpattric.remote.csb (unknown [10.22.32.220]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8292D492BEE; Thu, 19 Oct 2023 02:37:07 +0000 (UTC) From: Mike Pattrick To: dev@openvswitch.org Date: Wed, 18 Oct 2023 22:37:01 -0400 Message-Id: <20231019023701.1424733-1-mkp@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH v4] bond: Always revalidate unbalanced bonds when active member changes. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Currently a bond will not always revalidate when an active member changes. This can result in counter-intuitive behaviors like the fact that using ovs-appctl bond/set-active-member will cause the bond to revalidate but changing other_config:bond-primary will not trigger a revalidate in the bond. When revalidation is not set but the active member changes in an unbalanced bond, OVS may send traffic out of previously active member instead of the new active member. This change will always mark unbalanced bonds for revalidation if the active member changes. Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2214979 Signed-off-by: Mike Pattrick --- v2: Added a test v3: Made the test more reliable v4: Made test much more reliable --- ofproto/bond.c | 8 +++++-- tests/system-traffic.at | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/ofproto/bond.c b/ofproto/bond.c index cfdf44f85..fb108d30a 100644 --- a/ofproto/bond.c +++ b/ofproto/bond.c @@ -193,6 +193,7 @@ static void bond_update_post_recirc_rules__(struct bond *, bool force) static bool bond_is_falling_back_to_ab(const struct bond *); static void bond_add_lb_output_buckets(const struct bond *); static void bond_del_lb_output_buckets(const struct bond *); +static bool bond_is_balanced(const struct bond *bond) OVS_REQ_RDLOCK(rwlock); /* Attempts to parse 's' as the name of a bond balancing mode. If successful, @@ -552,11 +553,15 @@ bond_find_member_by_mac(const struct bond *bond, const struct eth_addr mac) static void bond_active_member_changed(struct bond *bond) + OVS_REQ_WRLOCK(rwlock) { if (bond->active_member) { struct eth_addr mac; netdev_get_etheraddr(bond->active_member->netdev, &mac); bond->active_member_mac = mac; + if (!bond_is_balanced(bond)) { + bond->bond_revalidate = true; + } } else { bond->active_member_mac = eth_addr_zero; } @@ -1124,7 +1129,7 @@ bond_get_recirc_id_and_hash_basis(struct bond *bond, uint32_t *recirc_id, /* Rebalancing. */ static bool -bond_is_balanced(const struct bond *bond) OVS_REQ_RDLOCK(rwlock) +bond_is_balanced(const struct bond *bond) { return bond->rebalance_interval && (bond->balance == BM_SLB || bond->balance == BM_TCP) @@ -1728,7 +1733,6 @@ bond_unixctl_set_active_member(struct unixctl_conn *conn, } if (bond->active_member != member) { - bond->bond_revalidate = true; bond->active_member = member; VLOG_INFO("bond %s: active member is now %s", bond->name, member->name); diff --git a/tests/system-traffic.at b/tests/system-traffic.at index 945037ec0..52c233be9 100644 --- a/tests/system-traffic.at +++ b/tests/system-traffic.at @@ -291,6 +291,56 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([datapath - bond active-backup failover]) +OVS_TRAFFIC_VSWITCHD_START([_ADD_BR([br1])]) + +AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"]) +AT_CHECK([ovs-ofctl add-flow br1 "actions=normal"]) + +ADD_NAMESPACES(at_ns0, at_ns1) + +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24") +ADD_VETH(p1, at_ns1, br1, "10.1.1.2/24") +on_exit 'ip link del link0a' +on_exit 'ip link del link0b' +AT_CHECK([ip link add link0a type veth peer name link1a]) +AT_CHECK([ip link add link0b type veth peer name link1b]) + +AT_CHECK([ip link set dev link0a up]) +AT_CHECK([ip link set dev link1a up]) +AT_CHECK([ip link set dev link0b up]) +AT_CHECK([ip link set dev link1b up]) + +AT_CHECK([ovs-vsctl add-bond br0 bond0 link0a link0b bond_mode=active-backup]) +AT_CHECK([ovs-vsctl add-bond br1 bond1 link1a link1b bond_mode=active-backup]) + +for i in `seq 1 3`; do +dnl Set primary bond member. +AT_CHECK([ovs-vsctl set port bond0 other_config:bond-primary=link0a -- \ + set port bond1 other_config:bond-primary=link1a]) + +OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.2]) + +NS_CHECK_EXEC([at_ns0], [ping -q -c 12 -i 0.6 -w 12 10.1.1.2 | grep -qv "100% packet loss"], [0]) + +dnl Check correct port is used. +AT_CHECK([ovs-appctl dpctl/dump-flows -m | grep -Eq "actions:link[[01]]a"], [0]) +AT_CHECK([ovs-appctl dpctl/dump-flows -m | grep -Eqv "actions:link[[01]]b"], [0]) + +dnl Change primary bond member. +AT_CHECK([ovs-vsctl set port bond0 other_config:bond-primary=link0b -- \ + set port bond1 other_config:bond-primary=link1b]) + +NS_CHECK_EXEC([at_ns0], [ping -q -c 12 -i 0.6 -w 12 10.1.1.2 | grep -q "12 received"], [0]) + +dnl Check correct port is used. +AT_CHECK([ovs-appctl dpctl/dump-flows -m | grep -Eqv "actions:link[[01]]a"], [0]) +AT_CHECK([ovs-appctl dpctl/dump-flows -m | grep -Eq "actions:link[[01]]b"], [0]) +done + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([datapath - ping over vxlan tunnel]) OVS_CHECK_TUNNEL_TSO() OVS_CHECK_VXLAN()