|  | @@ -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
 |