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.

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

Reply via email to