On 9/1/25 9:15 PM, Dumitru Ceara wrote:
> On 9/1/25 5:13 PM, Ilya Maximets wrote:
>> On 9/1/25 4:48 PM, Dumitru Ceara wrote:
>>> On 9/1/25 4:25 PM, Ilya Maximets wrote:
>>>> On 9/1/25 4:19 PM, Dumitru Ceara wrote:
>>>>> On 9/1/25 4:17 PM, Dumitru Ceara wrote:
>>>>>> On 9/1/25 4:12 PM, Ilya Maximets wrote:
>>>>>>> On 9/1/25 3:33 PM, Dumitru Ceara wrote:
>>>>>>>> Hi Ilya,
>>>>>>>>
>>>>>>>> Thanks for the review!
>>>>>>>>
>>>>>>>> On 9/1/25 3:23 PM, Ilya Maximets wrote:
>>>>>>>>> On 9/1/25 1:22 PM, Dumitru Ceara wrote:
>>>>>>>>>> Since 6919992d8781 ("Datapath_Binding: Separate type column and sync
>>>>>>>>>> NB.UUID to SB."), a new type column is added to SB datapaths to
>>>>>>>>>> differentiate between datapath types (switch vs router).  The same
>>>>>>>>>> commit also changed northd such that newly created SB datapaths have 
>>>>>>>>>> as
>>>>>>>>>> UUID the same value as the NB switch/router UUID.  All SB.Datapath
>>>>>>>>>> records were also updated and their 'type' field populated
>>>>>>>>>>
>>>>>>>>>> It also added a helper function, datapath_get_nb_uuid_and_type(), to
>>>>>>>>>> abstract out the extraction of a SB datapath's corresponding NB UUID 
>>>>>>>>>> and
>>>>>>>>>> type in the following way:
>>>>>>>>>> - if the SB.Datapath.type field has a value, the helper assumed that 
>>>>>>>>>> the
>>>>>>>>>>   SB.Datapath.UUID is equal to the NB.Logical_Switch/Router.UUID so 
>>>>>>>>>> it
>>>>>>>>>>   returned the 'type' value and the SB UUID
>>>>>>>>>> - else (for "old style") datapaths it extracted the NB UUID and type
>>>>>>>>>>   from the SB.Datapath.external_ids (as used to be done before the
>>>>>>>>>>   commit).
>>>>>>>>>>
>>>>>>>>>> This creates an upgrade issue thoughi: older (already existing before
>>>>>>>>>> upgrade) SB datapaths are not immediately recreated and their 'type'
>>>>>>>>>> is set; so the NB UUID value returned by 
>>>>>>>>>> datapath_get_nb_uuid_and_type()
>>>>>>>>>> for these records is incorrect.
>>>>>>>>>>
>>>>>>>>>> That stays like that until datapaths are finally recreated (due to 
>>>>>>>>>> other
>>>>>>>>>> events, e.g., full recompute of the datapath-sync nodes).  All that 
>>>>>>>>>> time
>>>>>>>>>> the lflow manager will incorrectly determine that the existing lflows
>>>>>>>>>> that are stale.  That's because the lflow manager uses
>>>>>>>>>> ovn_datapath_from_sbrec() which in turn relied on
>>>>>>>>>> datapath_get_nb_uuid_and_type() to determine the in-memory 
>>>>>>>>>> ovn_datapath
>>>>>>>>>> corresponding to the logical flow.
>>>>>>>>>>
>>>>>>>>>> There's no need to avoid re-creating SB.Datapath bindings as soon as
>>>>>>>>>> ovn-northd determines that they're not using the new scheme.  In 
>>>>>>>>>> order
>>>>>>>>>> to achieve that we add two sets of helpers:
>>>>>>>>>> a. one to be used by ovn-northd, ovn_datapath_get_nb_uuid_and_type()
>>>>>>>>>>    which only parses the new type of datapaths (everything else, i.e.
>>>>>>>>>>    old-style datapaths, will be considered stale)
>>>>>>>>>> b. one to be used by all other readers of SB datapaths (e.g.,
>>>>>>>>>>    ovn-controller, ovn-ic), datapath_get_nb_uuid_and_type_legacy()
>>>>>>>>>>    which relies on parsing external IDs (even in the new type of
>>>>>>>>>>    datapaths external IDs are still populated with the NB UUID in 
>>>>>>>>>> order
>>>>>>>>>>    to maintain backwards compatibility).
>>>>>>>>>
>>>>>>>>> Can we ever switch all users to the non-leagacy?  I'm not sure...
>>>>>>>>> Should probably be a TODO entry for this.
>>>>>>>>>
>>>>>>>>
>>>>>>>> We can, it should happen in the next LTS (26.03) though.  And it should
>>>>>>>> be the plan.
>>>>>>>
>>>>>>> How the transition is done?  i.e. is that guaranteed that the database
>>>>>>> is fully translated to the new format after the next upgrade?  Or was it
>>>>>>> decided that the full database rewrite on upgrade is not an issue and it
>>>>>>> works this way?
>>>>>>>
>>>>>>
>>>>>> Yes, it's guaranteed that after upgrade to 25.09.0 (or more recent) the
>>>>>> database is fully translated.  It was decided that it's not a concern to
>>>>>> do that.  Discussed here:
>>>>>>
>>>>>> https://mail.openvswitch.org/pipermail/ovs-dev/2025-August/425327.html
>>>>
>>>> OK.  FWIW, in comparison with the schema upgrade situation, this datapath
>>>> binding re-creation business may cause actual temporary traffic disruption
>>>> as we'll delete all the dynamic MAC bindings.  Is that the case?  I didn't
>>>> read it very carefully, but I don't see this being discussed in the linked
>>>> thread.
>>>>
>>>
>>> You're right, dynamic MAC bindings have not been discussed.  I guess we
>>> have a few options:
>>> a. leave it as is, dynamic MAC bindings will be recreated with the
>>> correct datapaths when needed, traffic will be buffered (for a bit) by
>>> ovn-controller
>>
>> The main problem here is that all that traffic is going to ovn-controller
>> and, as practice shows (we had an issue like this earlier this year),
>> CoPP starts dropping a fair share of this traffic causing a noticeable
>> amount of lost packets and visible delays on TCP connections.
>>
> 
> True, this sounds like the riskiest option.
> 
>>> b. try to update existing dynamic MAC bindings when their datapath is
>>> not accurate anymore (similar to what we do for static mac bindings)
>>
>> Sounds risky in way that it's not that simple to track.  We may have a
>> chance of moving entries to a wrong datapath.  Do you have ideas on how
>> to do the transition cleanly in northd?
>>
> 
> I was thinking of tracking the set of SB.datapath_bindings that were
> recreated (due to old-style format) and if we have any of those iterate
> through other types SB records that might need update (MAC_Binding,
> IGMP_Group and Learned_Route), update them and potentially schedule a
> forced full recompute for the next ovn-northd run (and trigger one).
> It's a bit compute heavy but only when we recreate old-style datapaths
> and it should cover all dependencies.
> 
> It's my impression that if we do that, the only potential traffic impact
> might be on IP multicast traffic.  That's because we might generate
> slightly different logical flows and SB.multicast_groups next time we
> run northd.  In my opinion, an acceptable compromise.
> 
> The other two types of records (dynamic mac bindings and learned routes)
> don't actually need the second (forced recompute) run of northd.
> 

After a closer look we might not even need the forced recompute.

>>> c. revert all the Datpath_Binding schema changes (type and UUID syncing)
>>
>> Maybe the safest option, but I'm not sure how much reverting this involves.
>>
> 
> I agree this is the safest option.  But that also means that we'll
> likely make it practically impossible to sync UUIDs from NB to SB in the
> future.  I'm not against that, I think the current incremental
> processing infrastructure in northd doesn't really need the UUIDs to be
> in sync.  But there were opinions from others that it would simplify the
> work if they're in sync.
> 
> In conclusion I think I'd try "b" update SB records that need update.
> I'm going to try to prepare something along those lines but it would be
> nice to hear opinions from Han, Mark, Ales and others too.
> 
>>>
>>> Other SB records created by ovn-controller and referring to
>>> Datapath_bindings are:
>>>
>>> - IGMP Group - ovn-controller will recreate this from memory immediately
>>> after the datapath binding update so there might be some disruption but
>>> minimal
>>
>> We should also remember that ovn-controller is handling the whole database
>> rewrite here as well.  So, it may take a bit longer than usual.
>>
>>> - Learned_Route - ovn-controller will recreate them too but we don't
>>> really expect any customer deployments pre 25.09 with BGP enabled.
>>
>> The feature was there since 25.03, so we may have some early users, I guess.
>>
> 
> Yes, possible but unlikely.  In any case, if we go with "b" or "c" we
> can we won't impact such users.
> 
>>>
>>>>>>
>>>>>>>> Good point about adding a TODO.  I can post a v3 or if
>>>>>>>> this is the only change that needs to happen maybe whoever merges this
>>>>>>>> series can add the following incremental:
>>>>>>>>
>>>>>>>> diff --git a/TODO.rst b/TODO.rst
>>>>>>>> index a9fe3ec4e8..4c7aa0c772 100644
>>>>>>>> --- a/TODO.rst
>>>>>>>> +++ b/TODO.rst
>>>>>>>> @@ -99,6 +99,12 @@ OVN To-do List
>>>>>>>>    * Implement I-P for datapath groups.
>>>>>>>>    * Implement I-P for route exchange relevant ports.
>>>>>>>>  
>>>>>>>> +* ovn-northd Incremental processing
>>>>>>>> +
>>>>>>>> +  * Remove datapath_get_nb_uuid_and_type_legacy() in the next LTS 
>>>>>>>> (26.03) as
>>>>>
>>>>> On second thought, this should be "after the next LTS (in 26.09)".
>>>>
>>>> Yep.
>>>>
>>>>>
>>>>>>>> +    all deployments should be using the new SB.Datapath_Binding.type 
>>>>>>>> column
>>>>>>>> +    at that point.
>>>>>>>> +
>>>>>>>>  * ovn-northd parallel logical flow processing
>>>>>>>>  
>>>>>>>>    * Multi-threaded logical flow computation was optimized for the case
>>>>>>>> ---
>>>>>>>>
>>>>>>>>> If not, then we should just drop the "new" way and stop duplicating
>>>>>>>>> the same information in two places.
>>>>>>>>>
>>>>>>>>> Best regards, Ilya Maximets.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Dumitru
>>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>
>>

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to