From patchwork Thu May 11 23:16:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Zhou X-Patchwork-Id: 761373 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wP8B81G1jz9s86 for ; Fri, 12 May 2017 09:16:31 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id B7DBCB1F; Thu, 11 May 2017 23:16:27 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 5CFDC486 for ; Thu, 11 May 2017 23:16:26 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f67.google.com (mail-pg0-f67.google.com [74.125.83.67]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 8F56B17B for ; Thu, 11 May 2017 23:16:25 +0000 (UTC) Received: by mail-pg0-f67.google.com with SMTP id i63so5224611pgd.2 for ; Thu, 11 May 2017 16:16:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id :content-transfer-encoding; bh=1fHU1OvjUDo4C1FK6uuaEwrLrjQmuqH/Jn9yw9ZyCh8=; b=tBP8s/G2ogUFh00WIBaciE7C7huZ/4o0oxlSKkGQAnJ5uV9bwVUG38nGII2W7RJQL+ Zxui3m9rTMY/3AqT7F8xV95rziVPjNDN8YXPkHJYE2eBAYzQvwA18Isx8185BHdeYGJd Ku3wI+QxzF84KABV/BIKZJLMraMPt2mnCTV6FDrdUZWdOjWK0/rzfgl5/bDGp0I5WdgX 8QdTBS/ZVGdS0KnO9yR7dfwiqEm6IhbZQXcahDIV2bsmQX39TLcYDtgtx/O9hpbuArsW /ut2sfd4JJoUSP8oSgeXk9SX6Z3bBFprcb7MDAdZ/ZiaY06ZWOvLG8l1zeZods4A5yoS HdmQ== X-Gm-Message-State: AODbwcCiNlycMYeSJ3ZcnYLgorDxGhhIOM4RkE9Z0490UwzJZEgp8U7A 5fDaXAQMGeVfcg== X-Received: by 10.99.6.2 with SMTP id 2mr1069291pgg.122.1494544585194; Thu, 11 May 2017 16:16:25 -0700 (PDT) Received: from ubuntu.localdomain ([208.91.1.34]) by smtp.gmail.com with ESMTPSA id c12sm1835477pgn.21.2017.05.11.16.16.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 11 May 2017 16:16:24 -0700 (PDT) From: Andy Zhou To: dev@openvswitch.org Date: Thu, 11 May 2017 16:16:17 -0700 Message-Id: <1494544577-4705-1-git-send-email-azhou@ovn.org> X-Mailer: git-send-email 1.9.1 X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH] bridge: Fix controller status update X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org When multiple bridges connects to the same controller, the controller status should be maintained separately for each bridge. Current logic pushes status updates only based on the connection string, which is the same across multiple bridges when connecting to the same controller. Report-at: https://mail.openvswitch.org/pipermail/ovs-discuss/2017-May/044412.html Reported-by: Tulio Ribeiro Signed-off-by: Andy Zhou Reviewed-by: Greg Rose --- AUTHORS.rst | 1 + tests/bridge.at | 33 +++++++++++++++++++++++++++++++++ vswitchd/bridge.c | 33 +++++++++++++++------------------ 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index 59639756b09f..147ce48d15ca 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -530,6 +530,7 @@ Teemu Koponen koponen@nicira.com Thomas Morin thomas.morin@orange.com Timothy Chen tchen@nicira.com Torbjorn Tornkvist kruskakli@gmail.com +Tulio Ribeiro tribeiro@lasige.di.fc.ul.pt Tytus Kurek Tytus.Kurek@pega.com Valentin Bud valentin@hackaserver.com Vasiliy Tolstov v.tolstov@selfip.ru diff --git a/tests/bridge.at b/tests/bridge.at index 3dbabe511780..58b27d445062 100644 --- a/tests/bridge.at +++ b/tests/bridge.at @@ -38,3 +38,36 @@ dummy@ovs-dummy: hit:0 missed:0 OVS_APP_EXIT_AND_WAIT([ovs-vswitchd]) OVS_APP_EXIT_AND_WAIT([ovsdb-server]) AT_CLEANUP + +dnl When multiple bridges are connected to the same controller, make +dnl sure their status are tracked independently. +AT_SETUP([bridge - multiple bridges share a controller]) +OVS_VSWITCHD_START( + [add-br br1 -- \ + set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \ + set bridge br1 datapath-type=dummy other-config:datapath-id=1234 ]) + +dnl Start ovs-testcontroller +AT_CHECK([ovs-testcontroller --detach punix:controller], [0], [ignore]) + +dnl Add the controller to both bridges, 5 seconds apart. +AT_CHECK([ovs-vsctl set-controller br0 unix:controller]) +AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +AT_CHECK([ovs-vsctl set-controller br1 unix:controller]) + +dnl Wait for the controller connection to come up +for i in `seq 0 7` +do + AT_CHECK([ovs-appctl time/warp 10], [0], [ignore]) +done + +dnl Make sure the connection status are different +AT_CHECK([ovs-vsctl --columns=status list controller | sort], [0], [dnl + +status : {sec_since_connect="0", state=ACTIVE} +status : {sec_since_connect="5", state=ACTIVE} +]) + +OVS_APP_EXIT_AND_WAIT([ovs-vswitchd]) +OVS_APP_EXIT_AND_WAIT([ovsdb-server]) +AT_CLEANUP diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 31203d1ec232..972146e8da6d 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -2704,34 +2704,31 @@ static void refresh_controller_status(void) { struct bridge *br; - struct shash info; - const struct ovsrec_controller *cfg; - - shash_init(&info); /* Accumulate status for controllers on all bridges. */ HMAP_FOR_EACH (br, node, &all_bridges) { + struct shash info = SHASH_INITIALIZER(&info); ofproto_get_ofproto_controller_info(br->ofproto, &info); - } - /* Update each controller in the database with current status. */ - OVSREC_CONTROLLER_FOR_EACH(cfg, idl) { - struct ofproto_controller_info *cinfo = - shash_find_data(&info, cfg->target); + /* Update each controller of the bridge in the database with + * current status. */ + struct ovsrec_controller **controllers; + size_t n_controllers = bridge_get_controllers(br, &controllers); + size_t i; + for (i = 0; i < n_controllers; i++) { + struct ovsrec_controller *cfg = controllers[i]; + struct ofproto_controller_info *cinfo = + shash_find_data(&info, cfg->target); - if (cinfo) { + ovs_assert(cinfo); ovsrec_controller_set_is_connected(cfg, cinfo->is_connected); - ovsrec_controller_set_role(cfg, ofp12_controller_role_to_str( - cinfo->role)); + const char *role = ofp12_controller_role_to_str(cinfo->role); + ovsrec_controller_set_role(cfg, role); ovsrec_controller_set_status(cfg, &cinfo->pairs); - } else { - ovsrec_controller_set_is_connected(cfg, false); - ovsrec_controller_set_role(cfg, NULL); - ovsrec_controller_set_status(cfg, NULL); } - } - ofproto_free_ofproto_controller_info(&info); + ofproto_free_ofproto_controller_info(&info); + } } /* Update interface and mirror statistics if necessary. */