On 12/11/24 1:38 PM, Dumitru Ceara wrote:
> On 12/11/24 1:19 PM, Felix Huettner via dev wrote:
>> On Wed, Dec 11, 2024 at 10:23:40AM +0100, [email protected] wrote:
>>> Hi Felix,
>>
>> Hi Martin,
>> thanks for the comments.
>>
>>> thanks for the update. I was testing this version yesterday and I have
>>> some thoughts regarding the referencing.
>>> Wouldn't it be better if the Advertised_Route was a non-root table and
>>> instead of having strong references to Port_Binding via "logical_port",
>>> it would be the Port_Binding that would have strong references to the
>>> Advertised_Route entries?
>>
>> We found out here
>> https://mail.openvswitch.org/pipermail/ovs-dev/2024-December/418890.html
>> that we can not have strong references from a non-root table to a root
>> table. This interferes with the correct deletion.
>>
>> So we could only do this if we remove any kind of outbound references
>> from these Tables and i don't think that is reasonable.
>> We would need to get rid of the "datapath" column (see below).
>>
>> Additionally tracked_port would need to be reworked. I don't know how
>> we could reasonably model this without a outbound reference.
>>
>>> I haven't tried my proposed setup yet (currently working on it), but my
>>> intention is for the Advertised_Route entry getting automatically
>>> cleaned up when the "logical_port" Port_Binding is removed. With the
>>> current proposal, Port_Binding removal is blocked due to the integrity
>>> violation (Advertised_Route still has strong ref to Port_Binding) and
>>> requires additional logic in northd to manually remove associated
>>> Advertised_Routes we want to remove Port_Binding.
>>
>> I would agree that this might be easier for incremental processing.
>>
>> However for the normal runs i don't think there is too much difference.
>> I have already logic that syncs the state of parsed_routes to the
>> southbound database. This also needs to handle changed ips and so on.
>> So deleting the routes when the logical_port no longer exists is at
>> least there already covered.
>>
>>>
>>> I have also couple questions below.
>>>
>>> On Tue, 2024-12-10 at 14:36 +0100, Felix Huettner via dev wrote:
>>>> These two tables will be used in the future to coordinate routing
>>>> information between northd and ovn-controller.
>>>> Northd will insert routes that should be advertised to the outside
>>>> fabric to Advertised_Route.
>>>> Ovn-controller will insert routes that have been learned from the
>>>> outside fabric to Learned_Route.
>>>>
>>>> Signed-off-by: Felix Huettner <[email protected]>
>>>> ---
>>>> v3->v4:
>>>> * split Route to Advertised_Route and Learned_Route
>>>> v2->v3:
>>>> * refType is now strong
>>>> * fixed typos
>>>>
>>>> ovn-sb.ovsschema | 38 ++++++++++++++++++++++++--
>>>> ovn-sb.xml | 70
>>>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>>> 2 files changed, 106 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema
>>>> index 73abf2c8d..61bc26457 100644
>>>> --- a/ovn-sb.ovsschema
>>>> +++ b/ovn-sb.ovsschema
>>>> @@ -1,7 +1,7 @@
>>>> {
>>>> "name": "OVN_Southbound",
>>>> - "version": "20.37.0",
>>>> - "cksum": "1950136776 31493",
>>>> + "version": "20.38.0",
>>>> + "cksum": "2175279464 33450",
>>>> "tables": {
>>>> "SB_Global": {
>>>> "columns": {
>>>> @@ -617,6 +617,40 @@
>>>> "type": {"key": "string", "value": "string",
>>>> "min": 0, "max": "unlimited"}}},
>>>> "indexes": [["chassis"]],
>>>> + "isRoot": true},
>>>> + "Advertised_Route": {
>>>> + "columns": {
>>>> + "datapath": {"type": {"key": {"type": "uuid",
>>>> + "refTable":
>>>> "Datapath_Binding",
>>>> + "refType":
>>>> "strong"}}},
>>>
>>> Is the ref. to Datapath_Binding necessary? Even with the current
>>> version where this table is Root, we already have reference to
>>> Port_Binding and if necessary, we can infer related Datapath_Binding by
>>> looking up Advertised_Route->logical_port->datapath.
>>
>> I think we could.
>> The main idea behind the direct connect between Datapath_Binding and
>> Advertised_Route or Learned_Route is that we generally use this
>> connection on the northd and ovn-controller side to process the entries.
>>
>> Basically having the datapath in there allows us to skip an iteration
>> over all Port_Bindings in a Datapath whenever we need all routes for it.
>>
>
> Yes, that's probably the main advantage, we can use an ovsdb idl index
> that filters by datapath.
>
>>>
>>>> + "logical_port": {"type": {"key": {"type": "uuid",
>>>> + "refTable":
>>>> "Port_Binding",
>>>> + "refType":
>>>> "strong"}}},
>>>> + "ip_prefix": {"type": "string"},
>>>> + "tracked_port": {"type": {"key": {"type": "uuid",
>>>> + "refTable":
>>>> "Port_Binding",
>>>> + "refType":
>>>> "strong"},
>>>
>>> Given that tracked_port is optional, wouldn't it be better for this
>>> reference to be weak? Otherwise we run into the same issue of needing
>>> manual northd logic when removing Port_Binding referenced here.
>>
>> The goal for the tracked_port is to specify the "nexthop" Port_Binding
>> of a Route. If the Port_Binding would be removed then this Route is no
>> longer valid and needs to be removed anyway. So i think because this is
>> directly related we don't need to be weak.
>>
>
> I agree.
>
I'll wait for more feedback on this patch until tomorrow. I do still
plan to apply the schema change as soon as possible to unblock the rest
of the work.
Thanks,
Dumitru
> Regards,
> Dumitru
>
>> Thanks a lot
>> Felix
>>
>>>
>>> Thanks,
>>> Martin.
>>>
>>>> + "min": 0,
>>>> + "max": 1}},
>>>> + "external_ids": {
>>>> + "type": {"key": "string", "value": "string",
>>>> + "min": 0, "max": "unlimited"}}},
>>>> + "indexes": [["datapath", "logical_port", "ip_prefix"]],
>>>> + "isRoot": true},
>>>> + "Learned_Route": {
>>>> + "columns": {
>>>> + "datapath": {"type": {"key": {"type": "uuid",
>>>> + "refTable":
>>>> "Datapath_Binding",
>>>> + "refType":
>>>> "strong"}}},
>>>> + "logical_port": {"type": {"key": {"type": "uuid",
>>>> + "refTable":
>>>> "Port_Binding",
>>>> + "refType":
>>>> "strong"}}},
>>>> + "ip_prefix": {"type": "string"},
>>>> + "nexthop": {"type": "string"},
>>>> + "external_ids": {
>>>> + "type": {"key": "string", "value": "string",
>>>> + "min": 0, "max": "unlimited"}}},
>>>> + "indexes": [["datapath", "logical_port", "ip_prefix",
>>>> "nexthop"]],
>>>> "isRoot": true}
>>>> }
>>>> }
>>>> diff --git a/ovn-sb.xml b/ovn-sb.xml
>>>> index ea4adc1c3..6fbc8b6df 100644
>>>> --- a/ovn-sb.xml
>>>> +++ b/ovn-sb.xml
>>>> @@ -5217,4 +5217,74 @@ tcp.flags = RST;
>>>> The set of variable values for a given chassis.
>>>> </column>
>>>> </table>
>>>> +
>>>> + <table name="Advertised_Route">
>>>> + <p>
>>>> + Each record represents a route that should be exported from
>>>> ovn to the
>>>> + outside network fabric.
>>>> + It is populated by <code>ovn-northd</code> based on the
>>>> addresses,
>>>> + routes and NAT Entries of a
>>>> + <code>OVN_Northbound.Logical_Router_Port</code>.
>>>> + </p>
>>>> +
>>>> + <column name="datapath">
>>>> + The datapath belonging to the
>>>> + <code>OVN_Northbound.Logical_Router</code> that this route is
>>>> valid
>>>> + for.
>>>> + </column>
>>>> +
>>>> + <column name="logical_port">
>>>> + This is the <ref table="Port_Binding"/> that the router will
>>>> send packets
>>>> + out that are received for the below prefix.
>>>> + </column>
>>>> +
>>>> + <column name="ip_prefix">
>>>> + IP prefix of this route (e.g. 192.168.100.0/24).
>>>> + </column>
>>>> +
>>>> + <column name="tracked_port">
>>>> + In combination with a host <code>ip_prefix</code> this tracks
>>>> the port
>>>> + OVN will forward the packets for this destination to.
>>>> + If set the <ref table="Advertised_Route" column="ip_prefix"/>
>>>> will always
>>>> + contain a /32 (for ipv4) or /128 (for ipv6) prefix.
>>>> +
>>>> + An announcing chassis can use this information to check if
>>>> this
>>>> + destination is local and adjust the route priorities based on
>>>> that.
>>>> + </column>
>>>> +
>>>> + <column name="external_ids">
>>>> + See <em>External IDs</em> at the beginning of this document.
>>>> + </column>
>>>> + </table>
>>>> +
>>>> + <table name="Learned_Route">
>>>> + <p>
>>>> + Each record represents a route that learned by ovn using some
>>>> dynamic
>>>> + routing logic outside of ovn.
>>>> + It is populated by <code>ovn-controller</code> with routes it
>>>> learns
>>>> + locally.
>>>> + </p>
>>>> +
>>>> + <column name="datapath">
>>>> + The datapath belonging to the
>>>> + <code>OVN_Northbound.Logical_Router</code> that this route is
>>>> valid
>>>> + for.
>>>> + </column>
>>>> +
>>>> + <column name="logical_port">
>>>> + This is the <ref table="Port_Binding"/> that the route was
>>>> learned on.
>>>> + </column>
>>>> +
>>>> + <column name="ip_prefix">
>>>> + IP prefix of this route (e.g. 192.168.100.0/24).
>>>> + </column>
>>>> +
>>>> + <column name="nexthop">
>>>> + This is the nexthop ip we learned from outside of OVN.
>>>> + </column>
>>>> +
>>>> + <column name="external_ids">
>>>> + See <em>External IDs</em> at the beginning of this document.
>>>> + </column>
>>>> + </table>
>>>> </database>
>>>
>> _______________________________________________
>> dev mailing list
>> [email protected]
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev