On Wed, Jul 24, 2024 at 1:23 PM Xavier Simonart <xsimo...@redhat.com> wrote:

> Hi Ales
>
> On Wed, Jul 24, 2024 at 7:24 AM Ales Musil <amu...@redhat.com> wrote:
>
>>
>>
>> On Tue, Jul 23, 2024 at 3:41 PM Xavier Simonart <xsimo...@redhat.com>
>> wrote:
>>
>>> Hi Ales
>>>
>>> Thanks for the patch.
>>> Some embedded comments.
>>>
>>>
>> Hi Xavier,
>>
>> thank you for the review.
>>
>>
>>> On Tue, Jul 16, 2024 at 1:52 PM Ales Musil <amu...@redhat.com> wrote:
>>>
>>>> The handler for OvS interface in runtime data was checking interface
>>>> type before proceeding with the I-P processing. The type is not
>>>> necessary because the main thing that is interesting for OVN is
>>>> the iface-id, if the interface doesn't have any it won't be processed
>>>> regardless of the type. The processing would happen anyway, however
>>>> it would be more costly because it would lead to full recompute
>>>> of the whole runtime data node.
>>>>
>>>> Reported-at: https://github.com/ovn-org/ovn/issues/174
>>>> Reported-at: https://issues.redhat.com/browse/FDP-255
>>>> Signed-off-by: Ales Musil <amu...@redhat.com>
>>>> ---
>>>>  controller/binding.c    | 25 ++++++---------------
>>>>  tests/ovn-controller.at | 48 +++++++++++++++++++++++++++++++++++++++++
>>>>  2 files changed, 55 insertions(+), 18 deletions(-)
>>>>
>>>> diff --git a/controller/binding.c b/controller/binding.c
>>>> index b7e7f4874..da1f8afcf 100644
>>>> --- a/controller/binding.c
>>>> +++ b/controller/binding.c
>>>> @@ -2505,17 +2505,6 @@ consider_iface_release(const struct
>>>> ovsrec_interface *iface_rec,
>>>>      return true;
>>>>  }
>>>>
>>>> -static bool
>>>> -is_iface_vif(const struct ovsrec_interface *iface_rec)
>>>> -{
>>>> -    if (iface_rec->type && iface_rec->type[0] &&
>>>> -        strcmp(iface_rec->type, "internal")) {
>>>> -        return false;
>>>> -    }
>>>> -
>>>> -    return true;
>>>> -}
>>>> -
>>>>  static bool
>>>>  is_iface_in_int_bridge(const struct ovsrec_interface *iface,
>>>>                         const struct ovsrec_bridge *br_int)
>>>> @@ -2630,17 +2619,17 @@ binding_handle_ovs_interface_changes(struct
>>>> binding_ctx_in *b_ctx_in,
>>>>      const struct ovsrec_interface *iface_rec;
>>>>      OVSREC_INTERFACE_TABLE_FOR_EACH_TRACKED (iface_rec,
>>>>                                               b_ctx_in->iface_table) {
>>>> -        if (!is_iface_vif(iface_rec)) {
>>>> -            /* Right now we are not handling ovs_interface changes of
>>>> -             * other types. This can be enhanced to handle of
>>>> -             * types - patch and tunnel. */
>>>> +        const char *iface_id = smap_get(&iface_rec->external_ids,
>>>> "iface-id");
>>>> +        const char *old_iface_id = smap_get(b_ctx_out->local_iface_ids,
>>>> +                                            iface_rec->name);
>>>> +        if (!iface_id && !old_iface_id) {
>>>> +            /* Right now we are not handling ovs_interface changes if
>>>> the
>>>> +             * interface doesn't have iface-id or didn't have it
>>>> +             * previously. */
>>>>              handled = false;
>>>>
>>> Will this not cause recomputes when adding an interface, and setting
>>> iface-id in two steps e.g.
>>> ovs-vsctl add-port br-int vif
>>> ovs-vsctl set Interface vif external-ids:iface-id=vif
>>>  While there was no recompute for this c
>>>
>>
>> You are right, however I'm not sure how to better approach this. I mean
>> the "workaround"
>> should be to use a single transaction which is doable from a CMS
>> perspective.
>>
>> I'm open to suggestions on how to avoid this problem though.
>>
> I agree that probably CMS would add the iface and set the iface-id in one
> command, but we would fix an issue related to recomputes w/ dpdk ports, and
> potentially add more recomputes in some (rare?) cases.
> As discussed separately, can we (also) check the i/f types as before - to
> avoid at least recompute in the cases where we had no recompute before ?
> So something like if (!iface_id && !old_iface_id &&
> !is_iface_vif(iface_rec)) ...
> This would cover different iface types when iface-id is added within the
> same transaction as iface, and keep current behavior for vif/internal ports
> (i.e. no recompute when added in two idl transactions)
> WDYT?
>

Makes sense, posted v2.


>>
>>>              break;
>>>>          }
>>>>
>>>> -        const char *iface_id = smap_get(&iface_rec->external_ids,
>>>> "iface-id");
>>>> -        const char *old_iface_id = smap_get(b_ctx_out->local_iface_ids,
>>>> -                                            iface_rec->name);
>>>>          const char *cleared_iface_id = NULL;
>>>>          if (!ovsrec_interface_is_deleted(iface_rec)) {
>>>>              int64_t ofport = iface_rec->n_ofport ? *iface_rec->ofport
>>>> : 0;
>>>> diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
>>>> index 2cb86dc98..be913676b 100644
>>>> --- a/tests/ovn-controller.at
>>>> +++ b/tests/ovn-controller.at
>>>> @@ -3127,3 +3127,51 @@ OVS_WAIT_UNTIL([grep -q 'tcp:127.0.0.1:1235:
>>>> connected' hv1/ovn-controller.log])
>>>>
>>>>  OVN_CLEANUP([hv1])
>>>>  AT_CLEANUP
>>>> +
>>>> +AT_SETUP([ovn-controller - I-P different port types])
>>>> +AT_KEYWORDS([ovn])
>>>> +ovn_start
>>>> +
>>>> +net_add n1
>>>> +sim_add hv1
>>>> +ovs-vsctl add-br br-phys
>>>> +ovn_attach n1 br-phys 192.168.0.20
>>>> +
>>>> +check ovn-nbctl ls-add ls0
>>>> +check ovn-nbctl lsp-add ls0 vif
>>>> +
>>>> +ovn-appctl inc-engine/clear-stats
>>>> +
>>>> +ovs-vsctl -- add-port br-int vif -- \
>>>> +    set Interface vif external-ids:iface-id=vif
>>>> +wait_row_count Port_Binding 1 logical_port="vif" up=true
>>>> +
>>>> +ovs-vsctl del-port br-int vif
>>>> +wait_row_count Port_Binding 1 logical_port="vif" up=false
>>>> +
>>>> +ovs-vsctl add-port br-int vif -- \
>>>> +    set Interface vif type=dummy -- \
>>>> +    set Interface vif external-ids:iface-id=vif
>>>> +wait_row_count Port_Binding 1 logical_port="vif" up=true
>>>> +
>>>> +ovs-vsctl del-port br-int vif
>>>> +wait_row_count Port_Binding 1 logical_port="vif" up=false
>>>> +
>>>> +ovs-vsctl add-port br-int vif -- \
>>>> +    set Interface vif type=geneve -- \
>>>> +    set Interface vif options:remote_ip=1.1.1.1
>>>> external-ids:iface-id=vif
>>>> +wait_row_count Port_Binding 1 logical_port="vif" up=true
>>>> +
>>>> +ovs-vsctl del-port br-int vif
>>>> +wait_row_count Port_Binding 1 logical_port="vif" up=false
>>>> +
>>>> +AT_CHECK([ovn-appctl inc-engine/show-stats runtime_data |\
>>>> +          sed "s/- compute:\s\+[[0-9]]\+/- compute: ??/"], [0], [dnl
>>>> +Node: runtime_data
>>>> +- recompute:            0
>>>> +- compute: ??
>>>> +- cancel:               0
>>>> +])
>>>> +
>>>> +OVN_CLEANUP([hv1])
>>>> +AT_CLEANUP
>>>> --
>>>> 2.45.2
>>>>
>>>> _______________________________________________
>>>> dev mailing list
>>>> d...@openvswitch.org
>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>>>
>>>>
>> Thanks,
>> Ales
>>
> Thanks
> Xavier
>
>> --
>>
>> Ales Musil
>>
>> Senior Software Engineer - OVN Core
>>
>> Red Hat EMEA <https://www.redhat.com>
>>
>> amu...@redhat.com
>> <https://red.ht/sig>
>>
>
Thanks,
Ales

-- 

Ales Musil

Senior Software Engineer - OVN Core

Red Hat EMEA <https://www.redhat.com>

amu...@redhat.com
<https://red.ht/sig>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to