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?

>
>
>>              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>
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to