|
|
|
@ -30,106 +30,112 @@ |
|
|
|
|
from __future__ import print_function |
|
|
|
|
|
|
|
|
|
from six.moves import urllib |
|
|
|
|
import jobset |
|
|
|
|
import logging |
|
|
|
|
import os |
|
|
|
|
import socket |
|
|
|
|
import subprocess |
|
|
|
|
import tempfile |
|
|
|
|
import sys |
|
|
|
|
import tempfile |
|
|
|
|
import time |
|
|
|
|
import jobset |
|
|
|
|
import socket |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# must be synchronized with test/core/utils/port_server_client.h |
|
|
|
|
_PORT_SERVER_PORT = 32766 |
|
|
|
|
|
|
|
|
|
def start_port_server(): |
|
|
|
|
# check if a compatible port server is running |
|
|
|
|
# if incompatible (version mismatch) ==> start a new one |
|
|
|
|
# if not running ==> start a new one |
|
|
|
|
# otherwise, leave it up |
|
|
|
|
try: |
|
|
|
|
version = int(urllib.request.urlopen( |
|
|
|
|
'http://localhost:%d/version_number' % port_server_port, |
|
|
|
|
timeout=10).read()) |
|
|
|
|
print('detected port server running version %d' % version) |
|
|
|
|
running = True |
|
|
|
|
except Exception as e: |
|
|
|
|
print('failed to detect port server: %s' % sys.exc_info()[0]) |
|
|
|
|
print(e.strerror) |
|
|
|
|
running = False |
|
|
|
|
if running: |
|
|
|
|
current_version = int(subprocess.check_output( |
|
|
|
|
[sys.executable, |
|
|
|
|
os.path.abspath('tools/run_tests/python_utils/port_server.py'), |
|
|
|
|
'dump_version'])) |
|
|
|
|
print('my port server is version %d' % current_version) |
|
|
|
|
running = (version >= current_version) |
|
|
|
|
# check if a compatible port server is running |
|
|
|
|
# if incompatible (version mismatch) ==> start a new one |
|
|
|
|
# if not running ==> start a new one |
|
|
|
|
# otherwise, leave it up |
|
|
|
|
try: |
|
|
|
|
version = int( |
|
|
|
|
urllib.request.urlopen( |
|
|
|
|
'http://localhost:%d/version_number' % _PORT_SERVER_PORT, |
|
|
|
|
timeout=10).read()) |
|
|
|
|
logging.info('detected port server running version %d', version) |
|
|
|
|
running = True |
|
|
|
|
except Exception as e: |
|
|
|
|
logging.exception('failed to detect port server') |
|
|
|
|
running = False |
|
|
|
|
if running: |
|
|
|
|
current_version = int( |
|
|
|
|
subprocess.check_output([ |
|
|
|
|
sys.executable, os.path.abspath( |
|
|
|
|
'tools/run_tests/python_utils/port_server.py'), |
|
|
|
|
'dump_version' |
|
|
|
|
])) |
|
|
|
|
logging.info('my port server is version %d', current_version) |
|
|
|
|
running = (version >= current_version) |
|
|
|
|
if not running: |
|
|
|
|
logging.info('port_server version mismatch: killing the old one') |
|
|
|
|
urllib.request.urlopen('http://localhost:%d/quitquitquit' % |
|
|
|
|
_PORT_SERVER_PORT).read() |
|
|
|
|
time.sleep(1) |
|
|
|
|
if not running: |
|
|
|
|
print('port_server version mismatch: killing the old one') |
|
|
|
|
urllib.request.urlopen('http://localhost:%d/quitquitquit' % |
|
|
|
|
port_server_port).read() |
|
|
|
|
time.sleep(1) |
|
|
|
|
if not running: |
|
|
|
|
fd, logfile = tempfile.mkstemp() |
|
|
|
|
os.close(fd) |
|
|
|
|
print('starting port_server, with log file %s' % logfile) |
|
|
|
|
args = [sys.executable, |
|
|
|
|
fd, logfile = tempfile.mkstemp() |
|
|
|
|
os.close(fd) |
|
|
|
|
logging.info('starting port_server, with log file %s', logfile) |
|
|
|
|
args = [ |
|
|
|
|
sys.executable, |
|
|
|
|
os.path.abspath('tools/run_tests/python_utils/port_server.py'), |
|
|
|
|
'-p', '%d' % port_server_port, '-l', logfile] |
|
|
|
|
env = dict(os.environ) |
|
|
|
|
env['BUILD_ID'] = 'pleaseDontKillMeJenkins' |
|
|
|
|
if jobset.platform_string() == 'windows': |
|
|
|
|
# Working directory of port server needs to be outside of Jenkins |
|
|
|
|
# workspace to prevent file lock issues. |
|
|
|
|
tempdir = tempfile.mkdtemp() |
|
|
|
|
port_server = subprocess.Popen( |
|
|
|
|
args, |
|
|
|
|
env=env, |
|
|
|
|
cwd=tempdir, |
|
|
|
|
creationflags = 0x00000008, # detached process |
|
|
|
|
close_fds=True) |
|
|
|
|
else: |
|
|
|
|
port_server = subprocess.Popen( |
|
|
|
|
args, |
|
|
|
|
env=env, |
|
|
|
|
preexec_fn=os.setsid, |
|
|
|
|
close_fds=True) |
|
|
|
|
time.sleep(1) |
|
|
|
|
# ensure port server is up |
|
|
|
|
waits = 0 |
|
|
|
|
while True: |
|
|
|
|
if waits > 10: |
|
|
|
|
print('killing port server due to excessive start up waits') |
|
|
|
|
port_server.kill() |
|
|
|
|
if port_server.poll() is not None: |
|
|
|
|
print('port_server failed to start') |
|
|
|
|
# try one final time: maybe another build managed to start one |
|
|
|
|
'-p', '%d' % _PORT_SERVER_PORT, '-l', logfile |
|
|
|
|
] |
|
|
|
|
env = dict(os.environ) |
|
|
|
|
env['BUILD_ID'] = 'pleaseDontKillMeJenkins' |
|
|
|
|
if jobset.platform_string() == 'windows': |
|
|
|
|
# Working directory of port server needs to be outside of Jenkins |
|
|
|
|
# workspace to prevent file lock issues. |
|
|
|
|
tempdir = tempfile.mkdtemp() |
|
|
|
|
port_server = subprocess.Popen( |
|
|
|
|
args, |
|
|
|
|
env=env, |
|
|
|
|
cwd=tempdir, |
|
|
|
|
creationflags=0x00000008, # detached process |
|
|
|
|
close_fds=True) |
|
|
|
|
else: |
|
|
|
|
port_server = subprocess.Popen( |
|
|
|
|
args, env=env, preexec_fn=os.setsid, close_fds=True) |
|
|
|
|
time.sleep(1) |
|
|
|
|
try: |
|
|
|
|
urllib.request.urlopen('http://localhost:%d/get' % port_server_port, |
|
|
|
|
timeout=1).read() |
|
|
|
|
print('last ditch attempt to contact port server succeeded') |
|
|
|
|
break |
|
|
|
|
except: |
|
|
|
|
traceback.print_exc() |
|
|
|
|
port_log = open(logfile, 'r').read() |
|
|
|
|
print(port_log) |
|
|
|
|
sys.exit(1) |
|
|
|
|
try: |
|
|
|
|
urllib.request.urlopen('http://localhost:%d/get' % port_server_port, |
|
|
|
|
# ensure port server is up |
|
|
|
|
waits = 0 |
|
|
|
|
while True: |
|
|
|
|
if waits > 10: |
|
|
|
|
logging.warning( |
|
|
|
|
'killing port server due to excessive start up waits') |
|
|
|
|
port_server.kill() |
|
|
|
|
if port_server.poll() is not None: |
|
|
|
|
logging.error('port_server failed to start') |
|
|
|
|
# try one final time: maybe another build managed to start one |
|
|
|
|
time.sleep(1) |
|
|
|
|
try: |
|
|
|
|
urllib.request.urlopen( |
|
|
|
|
'http://localhost:%d/get' % _PORT_SERVER_PORT, |
|
|
|
|
timeout=1).read() |
|
|
|
|
print('port server is up and ready') |
|
|
|
|
break |
|
|
|
|
except socket.timeout: |
|
|
|
|
print('waiting for port_server: timeout') |
|
|
|
|
traceback.print_exc(); |
|
|
|
|
time.sleep(1) |
|
|
|
|
waits += 1 |
|
|
|
|
except urllib.error.URLError: |
|
|
|
|
print('waiting for port_server: urlerror') |
|
|
|
|
traceback.print_exc(); |
|
|
|
|
time.sleep(1) |
|
|
|
|
waits += 1 |
|
|
|
|
except: |
|
|
|
|
traceback.print_exc() |
|
|
|
|
port_server.kill() |
|
|
|
|
raise |
|
|
|
|
logging.info( |
|
|
|
|
'last ditch attempt to contact port server succeeded') |
|
|
|
|
break |
|
|
|
|
except: |
|
|
|
|
logging.exception( |
|
|
|
|
'final attempt to contact port server failed') |
|
|
|
|
port_log = open(logfile, 'r').read() |
|
|
|
|
print(port_log) |
|
|
|
|
sys.exit(1) |
|
|
|
|
try: |
|
|
|
|
port_server_url = 'http://localhost:%d/get' % _PORT_SERVER_PORT |
|
|
|
|
urllib.request.urlopen(port_server_url, timeout=1).read() |
|
|
|
|
logging.info('port server is up and ready') |
|
|
|
|
break |
|
|
|
|
except socket.timeout: |
|
|
|
|
logging.exception('while waiting for port_server') |
|
|
|
|
time.sleep(1) |
|
|
|
|
waits += 1 |
|
|
|
|
except urllib.error.URLError: |
|
|
|
|
logging.exception('while waiting for port_server') |
|
|
|
|
time.sleep(1) |
|
|
|
|
waits += 1 |
|
|
|
|
except: |
|
|
|
|
logging.exception('error while contacting port server at "%s".' |
|
|
|
|
'Will try killing it.', port_server_url) |
|
|
|
|
port_server.kill() |
|
|
|
|
raise |
|
|
|
|