[ovs-dev] [PATCH] bridge: Fix controller status update

Andy Zhou azhou at ovn.org
Fri May 12 19:07:55 UTC 2017


On Thu, May 11, 2017 at 8:35 PM, Greg Rose <gvrose8192 at gmail.com> wrote:
> On Thu, 2017-05-11 at 16:16 -0700, Andy Zhou wrote:
>> 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 <tribeiro at lasige.di.fc.ul.pt>
>> Signed-off-by: Andy Zhou <azhou at ovn.org>
>> ---
>>  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 at nicira.com
>>  Thomas Morin                    thomas.morin at orange.com
>>  Timothy Chen                    tchen at nicira.com
>>  Torbjorn Tornkvist              kruskakli at gmail.com
>> +Tulio Ribeiro                   tribeiro at lasige.di.fc.ul.pt
>>  Tytus Kurek                     Tytus.Kurek at pega.com
>>  Valentin Bud                    valentin at hackaserver.com
>>  Vasiliy Tolstov                 v.tolstov at 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 at 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. */
>
> I can't that I'm super familiar with this code but this LGTM.
>
> Reviewed-by: Greg Rose <gvrose at 8192@gmail.com>

Thanks for the review. I will push it if I don't hear from Tulio in
the next few days.
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev


More information about the dev mailing list