On 9/18/24 12:06, Dumitru Ceara wrote:
> On 9/17/24 19:00, Rosemarie O'Riorden wrote:
>> When preparing to build ECMP and static route flows, routes are sorted
>> into unique routes (meaning they are not part of a group) or they are
>> added to EMCP groups. Then, ECMP route flows are built out of the
>> groups, and static route flows are built out of the unique routes.
>> However, 'unique routes' include ones that use the
>> --ecmp-symmetric-reply flag, meaning that they may not be added to an
>> ECMP group, and thus ECMP symmetric reply would not be used for those
>> flows.
>>
>> For example, if one route is added and traffic is started, and then
>> later another route is added, the already flowing traffic might be
>> rerouted since it wasn't conntracked initially. This could break
>> symmetric reply with traffic using a different next-hop than before.
>>
>> This change makes it so that when the --ecmp-symmetric-reply flag is
>> used, even for unique routes, an ECMP group is created which they are
>> added to. Thus they are added to the ECMP route flow, rather than
>> static. This allows ECMP groups to persist even when there is only one
>> route.
>>
>> Edited documentation to support this change.
>> Also updated incorrect actions in documentation.
>>
>> Fixes: 4fdca656857d ("Add ECMP symmetric replies.")
>> Reported-at: https://issues.redhat.com/browse/FDP-786
>> Signed-off-by: Rosemarie O'Riorden <[email protected]>
>> ---
> 
> Hi Rosemarie,
> 
> Thanks for the fix!
> 
>>  northd/northd.c         | 33 ++++++++++++++++++++++-----------
>>  northd/ovn-northd.8.xml | 13 ++++++++++++-
>>  tests/ovn-northd.at     |  5 ++++-
>>  3 files changed, 38 insertions(+), 13 deletions(-)
>>
>> diff --git a/northd/northd.c b/northd/northd.c
>> index 983c464eb..8ae3a75bd 100644
>> --- a/northd/northd.c
>> +++ b/northd/northd.c
>> @@ -11567,21 +11567,27 @@ build_ecmp_route_flow(struct lflow_table *lflows, 
>> struct ovn_datapath *od,
>>  
>>      struct ds actions = DS_EMPTY_INITIALIZER;
>>      ds_put_format(&actions, "ip.ttl--; flags.loopback = 1; %s = %"PRIu16
>> -                  "; %s = select(", REG_ECMP_GROUP_ID, eg->id,
>> -                  REG_ECMP_MEMBER_ID);
>> +                  "; %s = ", REG_ECMP_GROUP_ID, eg->id, REG_ECMP_MEMBER_ID);
>>  
>> -    bool is_first = true;
>> -    LIST_FOR_EACH (er, list_node, &eg->route_list) {
>> -        if (is_first) {
>> -            is_first = false;
>> -        } else {
>> -            ds_put_cstr(&actions, ", ");
>> +    if (!ovs_list_is_singleton(&eg->route_list)) {
>> +        bool is_first = true;
>> +
>> +        ds_put_cstr(&actions, "select(");
>> +        LIST_FOR_EACH (er, list_node, &eg->route_list) {
>> +            if (is_first) {
>> +                is_first = false;
>> +            } else {
>> +                ds_put_cstr(&actions, ", ");
>> +            }
>> +            ds_put_format(&actions, "%"PRIu16, er->id);
>>          }
>> -        ds_put_format(&actions, "%"PRIu16, er->id);
>> +        ds_put_cstr(&actions, ");");
>> +    } else {
>> +        er = CONTAINER_OF(ovs_list_front(&eg->route_list),
>> +                          struct ecmp_route_list_node, list_node);
>> +        ds_put_format(&actions, "%"PRIu16"; next;", er->id);
>>      }
>>  
>> -    ds_put_cstr(&actions, ");");
>> -
> 
> Isn't it simpler to just allow "select(<single-value>)" logical actions?
>  It doesn't feel too wrong to allow select to select a value from a set
> that only contains a single value.
> 
> As far as I can tell, from a performance perspective this doesn't make
> much difference.  Also, in general, we expect "ecmp routes with a single
> path" to be a transient state, e.g., due to maintenance some paths are
> brought down for a finite duration of time.
> 
> We do have to remove the restriction in `parse_select_action()` to allow
> ovn-controller to parse actions of form "select(<single-value>)".
> 
> Then we don't need this special treatment for the single next hop case here.

Wouldn't this require even more special treatment in a form of a
feature flag that ovn-controller reports so we don't generate actions
it doesn't understand?

Might be painful, especially if we're going to backport this fix
to stable releases.

Best regards, Ilya Maximets.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to