qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] tests/avocado: Cancel BootLinux tests in case there is no fr


From: Thomas Huth
Subject: Re: [PATCH] tests/avocado: Cancel BootLinux tests in case there is no free port
Date: Tue, 8 Mar 2022 20:13:44 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.6.0

On 07/03/2022 19.48, Daniel P. Berrangé wrote:
On Mon, Mar 07, 2022 at 07:31:50PM +0100, Thomas Huth wrote:
On 07/03/2022 13.50, Daniel P. Berrangé wrote:
On Mon, Feb 28, 2022 at 12:43:25PM +0100, Thomas Huth wrote:
The BootLinux tests are currently failing with an ugly python
stack trace on my RHEL8 system since they cannot get a free port
(likely due to the firewall settings on my system). Let's properly
check the return value of find_free_port() instead and cancel the
test gracefully if it cannot get a free port.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
   Unfortunately, it still takes > 70 seconds for each and every
   tests from tests/avocado/boot_linux.py to get canceled, so
   tests/avocado/boot_linux.py still renders "make check-avocado"
   for me pretty unusable... looking at the implementation of
   find_free_port() in Avocado, I wonder whether there isn't a
   better way to get a free port number in Python? Brute-forcing
   all ports between 1024 and 65536 seems just quite cumbersome
   to me...

Even in the worst case of testing every single port,
for INET and INET6 and for STREAM and DGRAM sockets,
that find_free_port port completes in a couple of
seconds.

Weird, on my system, the test runs for 70 seconds, just to finally
discovered that there was no free port available.

Incidentally I'm really suprised you even hit the 'no free port'
scenario. I've never seen that happen unless the machine was
basically doomed due to something leaking open sockets by the
10's of 1000's.

You mention firewall settings above, but I don't think that's
relevant. The find_free_port() call is with no args, so it
gets set to 'address=localhost' which means is_port_free
takes the bind() codepath. The firewall has no interaction
with the bind() codepath in the kernel AFAIK.

Yes, I've now had another closer look, and indeed, the firewall is not the problem here - but is_port_free() seems to be very buggy. The problem is that I do not have any IPv6 address configured on my system, and in that case the current code fails. See https://github.com/avocado-framework/avocado/issues/5273 ... I need this patch to fix it:

diff --git a/avocado/utils/network/ports.py b/avocado/utils/network/ports.py
--- a/avocado/utils/network/ports.py
+++ b/avocado/utils/network/ports.py
@@ -60,7 +60,7 @@ def is_port_free(port, address):
                     if localhost:
                         return False
                 sock.close()
-        return True
+                return True
     finally:
         if sock is not None:
             sock.close()

 Thomas




reply via email to

[Prev in Thread] Current Thread [Next in Thread]