On 9/18/24 12:26, Ilya Maximets wrote:
> 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.
Also, there is already a similar code in northd for router policies. So,
it would make more sense to change both at once outside of a bug fix.
>
> Best regards, Ilya Maximets.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev