On 4/4/24 12:46, Dumitru Ceara wrote:
On 4/4/24 17:52, Vladislav Odintsov wrote:
Thanks Dumitru!
I’m totally fine with your change.
Should I send backport patches with resolved conflicts for remaining branches 
at least till 22.03, which is an LTS?


Well, 24.03 is the most recent LTS.  We don't really backport patches to
22.03 unless they fix critical issues.  I'm not completely convinced
that this is such a critical issue though.  You need 4K logical
datapaths with vxlan enabled before this gets hit.  In any case, Mark,
what do you think?

I don't think this needs backporting down to 22.03.


Regards,
Dumitru

On 4 Apr 2024, at 18:26, Dumitru Ceara <dce...@redhat.com> wrote:

On 4/1/24 16:27, Mark Michelson wrote:
Thanks Vladislav,

Acked-by: Mark Michelson <mmich...@redhat.com <mailto:mmich...@redhat.com>>


Thanks, Vladislav and Mark!  Applied to main and backported down to
23.06 with a minor test change, please see below.

On 4/1/24 08:15, Vladislav Odintsov wrote:
In case if all tunnel ids are exhausted, ovn_allocate_tnlid() function
iterates over tnlids indefinitely when *hint is outside of [min, max].
This is because when tnlid reaches max, next tnlid is min and for-loop
never reaches exit condition for tnlid != *hint.

This patch fixes mentioned issue and adds a testcase.

Signed-off-by: Vladislav Odintsov <odiv...@gmail.com>
---
   lib/ovn-util.c      | 10 +++++++---
   tests/ovn-northd.at | 26 ++++++++++++++++++++++++++
   2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/lib/ovn-util.c b/lib/ovn-util.c
index ee5cbcdc3..9f97ae2ca 100644
--- a/lib/ovn-util.c
+++ b/lib/ovn-util.c
@@ -693,13 +693,17 @@ uint32_t
   ovn_allocate_tnlid(struct hmap *set, const char *name, uint32_t min,
                      uint32_t max, uint32_t *hint)
   {
-    for (uint32_t tnlid = next_tnlid(*hint, min, max); tnlid != *hint;
-         tnlid = next_tnlid(tnlid, min, max)) {
+    /* Normalize hint, because it can be outside of [min, max]. */
+    *hint = next_tnlid(*hint, min, max);
+
+    uint32_t tnlid = *hint;
+    do {
           if (ovn_add_tnlid(set, tnlid)) {
               *hint = tnlid;
               return tnlid;
           }
-    }
+        tnlid = next_tnlid(tnlid, min, max);
+    } while (tnlid != *hint);
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
       VLOG_WARN_RL(&rl, "all %s tunnel ids exhausted", name);
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index cd53755b2..174dbacda 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -2822,6 +2822,32 @@ AT_CHECK([test $lsp02 = 3 && test $ls1 = 123])
   AT_CLEANUP
   ])
   +OVN_FOR_EACH_NORTHD_NO_HV([
+AT_SETUP([check tunnel ids exhaustion])
+ovn_start
+
+# Create a fake chassis with vxlan encap to lower MAX DP tunnel key
to 2^12
+ovn-sbctl \
+    --id=@e create encap chassis_name=hv1 ip="192.168.0.1"
type="vxlan" \
+    -- --id=@c create chassis name=hv1 encaps=@e
+
+cmd="ovn-nbctl --wait=sb"
+
+for i in {1..4097..1}; do

This can be changed to:

for i in {1..4097}; do

+    cmd="${cmd} -- ls-add lsw-${i}"
+done
+
+eval $cmd
+
+check_row_count nb:Logical_Switch 4097
+wait_row_count sb:Datapath_Binding 4095
+
+OVS_WAIT_UNTIL([grep "all datapath tunnel ids exhausted"
northd/ovn-northd.log])
+
+AT_CLEANUP
+])
+
+
   OVN_FOR_EACH_NORTHD_NO_HV([
   AT_SETUP([Logical Flow Datapath Groups])
   ovn_start

Regards,
Dumitru

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


Regards,
Vladislav Odintsov




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

Reply via email to