Merge pull request #9739 from dgquintas/traceback_port_server

Port server missing import
pull/8501/merge
David G. Quintas 8 years ago committed by GitHub
commit f0355bfa0e
  1. 186
      tools/run_tests/python_utils/start_port_server.py

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

Loading…
Cancel
Save