17199: Avoid returning same port twice from find_available_port().
authorTom Clegg <tom@tomclegg.ca>
Mon, 7 Dec 2020 18:43:23 +0000 (13:43 -0500)
committerTom Clegg <tom@tomclegg.ca>
Tue, 8 Dec 2020 15:57:22 +0000 (10:57 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>

sdk/python/tests/run_test_server.py

index 0cb4151ac3b040292c0af4b5c8b5eef888b48096..c79aa4e945924f782b93fc7c76389b657fe6ecc7 100644 (file)
@@ -73,6 +73,7 @@ if not os.path.exists(TEST_TMPDIR):
 my_api_host = None
 _cached_config = {}
 _cached_db_config = {}
+_already_used_port = {}
 
 def find_server_pid(PID_PATH, wait=10):
     now = time.time()
@@ -181,11 +182,15 @@ def find_available_port():
     would take care of the races, and this wouldn't be needed at all.
     """
 
-    sock = socket.socket()
-    sock.bind(('0.0.0.0', 0))
-    port = sock.getsockname()[1]
-    sock.close()
-    return port
+    global _already_used_port
+    while True:
+        sock = socket.socket()
+        sock.bind(('0.0.0.0', 0))
+        port = sock.getsockname()[1]
+        sock.close()
+        if port not in _already_used_port:
+            _already_used_port[port] = True
+            return port
 
 def _wait_until_port_listens(port, timeout=10, warn=True):
     """Wait for a process to start listening on the given port.