|
|
|
@ -46,7 +46,7 @@ import threading |
|
|
|
|
# increment this number whenever making a change to ensure that |
|
|
|
|
# the changes are picked up by running CI servers |
|
|
|
|
# note that all changes must be backwards compatible |
|
|
|
|
_MY_VERSION = 10 |
|
|
|
|
_MY_VERSION = 11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if len(sys.argv) == 2 and sys.argv[1] == 'dump_version': |
|
|
|
@ -70,6 +70,7 @@ print('port server running on port %d' % args.port) |
|
|
|
|
|
|
|
|
|
pool = [] |
|
|
|
|
in_use = {} |
|
|
|
|
mu = threading.Lock() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def refill_pool(max_timeout, req): |
|
|
|
@ -97,16 +98,21 @@ def refill_pool(max_timeout, req): |
|
|
|
|
def allocate_port(req): |
|
|
|
|
global pool |
|
|
|
|
global in_use |
|
|
|
|
global mu |
|
|
|
|
mu.acquire() |
|
|
|
|
max_timeout = 600 |
|
|
|
|
while not pool: |
|
|
|
|
refill_pool(max_timeout, req) |
|
|
|
|
if not pool: |
|
|
|
|
req.log_message("failed to find ports: retrying soon") |
|
|
|
|
mu.release() |
|
|
|
|
time.sleep(1) |
|
|
|
|
mu.acquire() |
|
|
|
|
max_timeout /= 2 |
|
|
|
|
port = pool[0] |
|
|
|
|
pool = pool[1:] |
|
|
|
|
in_use[port] = time.time() |
|
|
|
|
mu.release() |
|
|
|
|
return port |
|
|
|
|
|
|
|
|
|
|
|
|
|
|