Chromium Code Reviews| Index: Tools/Scripts/webkitpy/layout_tests/servers/server_base.py |
| diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py b/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py |
| index 5b7f34121a3e97bd77be4ab41029ef3aad2ccd93..6d463cf8fa02c0614ac0f852a1d4fff23d838b32 100644 |
| --- a/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py |
| +++ b/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py |
| @@ -76,6 +76,7 @@ class ServerBase(object): |
| self._stderr = self._executive.PIPE |
| self._process = None |
| self._pid = None |
| + self._error_log = None |
| def start(self): |
| """Starts the server. It is an error to start an already started server. |
| @@ -87,6 +88,7 @@ class ServerBase(object): |
| if self._filesystem.exists(self._pid_file): |
| try: |
| self._pid = int(self._filesystem.read_text_file(self._pid_file)) |
| + _log.debug('stale %s pid file, pid %d' % (self._name, self._pid)) |
| self._stop_running_server() |
| except (ValueError, UnicodeDecodeError): |
| # These could be raised if the pid file is corrupt. |
| @@ -102,6 +104,7 @@ class ServerBase(object): |
| if self._wait_for_action(self._is_server_running_on_all_ports): |
| _log.debug("%s successfully started (pid = %d)" % (self._name, self._pid)) |
| else: |
| + self._dump_logs() |
| self._stop_running_server() |
| raise ServerError('Failed to start %s server' % self._name) |
| @@ -171,9 +174,13 @@ class ServerBase(object): |
| def _check_and_kill(self): |
| if self._executive.check_running_pid(self._pid): |
| + _log.debug('pid %d is running, killing it' % self._pid) |
| host = self._port_obj.host |
| self._executive.kill_process(self._pid) |
| return False |
| + else: |
| + _log.debug('pid %d is not running' % self._pid) |
| + |
| return True |
| def _remove_pid_file(self): |
| @@ -187,6 +194,34 @@ class ServerBase(object): |
| full_path = self._filesystem.join(folder, file) |
| self._filesystem.remove(full_path) |
| + def _dump_logs(self): |
| + _log.error('%s dumping logs' % self._name) |
| + if self._process: |
| + _log.error('%s returncode %s' % (self._name, str(self._process.returncode))) |
| + if self._process.stderr: |
| + stderr_text = self._process.stderr.read() |
| + if stderr_text: |
| + _log.error('%s stderr:' % self._name) |
| + for line in stderr_text.splitlines(): |
| + _log.error(' %s' % line) |
| + else: |
| + _log.error('%s no stderr' % self._name) |
| + else: |
| + _log.error('%s no stderr handle' % self._name) |
| + else: |
| + _log.error('%s no process' % self._name) |
| + if self._error_log: |
| + error_log_text = self._filesystem.read_text_file(self._error_log) |
| + if error_log_text: |
| + _log.error('%s error log (%s) contents:' % (self._name, self._error_log)) |
| + for line in error_log_text.splitlines(): |
| + _log.error(' %s' % line) |
| + else: |
| + _log.error('%s error log empty' % self._name) |
| + _log.error('') |
| + else: |
| + _log.error('%s no error log' % self._name) |
| + |
| def _wait_for_action(self, action, wait_secs=20.0, sleep_secs=1.0): |
| """Repeat the action for wait_sec or until it succeeds, sleeping for sleep_secs |
| in between each attempt. Returns whether it succeeded.""" |
| @@ -202,8 +237,9 @@ class ServerBase(object): |
| def _is_server_running_on_all_ports(self): |
| """Returns whether the server is running on all the desired ports.""" |
| if not self._executive.check_running_pid(self._pid): |
| - _log.debug("Server isn't running at all") |
| - raise ServerError("Server exited") |
| + _log.error("Server isn't running at all") |
| + self._dump_logs() |
| + raise ServerError |
| for mapping in self._mappings: |
| s = socket.socket() |
| @@ -223,7 +259,7 @@ class ServerBase(object): |
| def _check_that_all_ports_are_available(self): |
| for mapping in self._mappings: |
| s = socket.socket() |
| - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| + # s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
|
Dirk Pranke
2014/07/23 23:21:11
I think if we set SO_REUSEADDR, on windows this wa
|
| port = mapping['port'] |
| try: |
| s.bind(('localhost', port)) |
| @@ -236,3 +272,4 @@ class ServerBase(object): |
| raise |
| finally: |
| s.close() |
| + _log.debug('all ports are available') |