- Revision
- 285081
- Author
- [email protected]
- Date
- 2021-10-30 10:09:52 -0700 (Sat, 30 Oct 2021)
Log Message
Ensure we stop LayoutTest servers without them becoming zombies
https://bugs.webkit.org/show_bug.cgi?id=225189
<rdar://problem/77604119>
Reviewed by Jonathan Bedard.
Also increase the polling frequency in HttpServerBase._wait_for_action, as this is a major
source of delay when running run-webkit-tests --dry-run due to the number of servers we're
starting nowadays.
* Scripts/webkitpy/common/system/executive_mock.py:
(MockProcess.__init__): Rename self.returncode to _returncode
(MockProcess.returncode): returncode should be None if process is still running
* Scripts/webkitpy/layout_tests/servers/http_server.py:
(Lighttpd._spawn_process): Store Popen object
(Lighttpd._check_and_kill): Skip "kill" if process has returned
(Lighttpd._is_server_running_on_all_ports): Correctly raise ServerError if it has returned
* Scripts/webkitpy/layout_tests/servers/http_server_base.py:
(HttpServerBase.start): Change polling frequency for cygwin from 0.1Hz to default
(HttpServerBase._wait_for_action): Increase default polling frequency to 10Hz from 1Hz
* Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:
(WebPlatformTestServer._stop_running_server): Poll first so we don't have zombies keeping references to pipes
Modified Paths
Diff
Modified: trunk/Tools/ChangeLog (285080 => 285081)
--- trunk/Tools/ChangeLog 2021-10-30 16:08:17 UTC (rev 285080)
+++ trunk/Tools/ChangeLog 2021-10-30 17:09:52 UTC (rev 285081)
@@ -1,3 +1,28 @@
+2021-10-30 Sam Sneddon <[email protected]>
+
+ Ensure we stop LayoutTest servers without them becoming zombies
+ https://bugs.webkit.org/show_bug.cgi?id=225189
+ <rdar://problem/77604119>
+
+ Reviewed by Jonathan Bedard.
+
+ Also increase the polling frequency in HttpServerBase._wait_for_action, as this is a major
+ source of delay when running run-webkit-tests --dry-run due to the number of servers we're
+ starting nowadays.
+
+ * Scripts/webkitpy/common/system/executive_mock.py:
+ (MockProcess.__init__): Rename self.returncode to _returncode
+ (MockProcess.returncode): returncode should be None if process is still running
+ * Scripts/webkitpy/layout_tests/servers/http_server.py:
+ (Lighttpd._spawn_process): Store Popen object
+ (Lighttpd._check_and_kill): Skip "kill" if process has returned
+ (Lighttpd._is_server_running_on_all_ports): Correctly raise ServerError if it has returned
+ * Scripts/webkitpy/layout_tests/servers/http_server_base.py:
+ (HttpServerBase.start): Change polling frequency for cygwin from 0.1Hz to default
+ (HttpServerBase._wait_for_action): Increase default polling frequency to 10Hz from 1Hz
+ * Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:
+ (WebPlatformTestServer._stop_running_server): Poll first so we don't have zombies keeping references to pipes
+
2021-10-30 Kate Cheney <[email protected]>
[iOS 15] Loads after WKWebView session restore are marked as app-initiated
Modified: trunk/Tools/Scripts/webkitpy/common/system/executive_mock.py (285080 => 285081)
--- trunk/Tools/Scripts/webkitpy/common/system/executive_mock.py 2021-10-30 16:08:17 UTC (rev 285080)
+++ trunk/Tools/Scripts/webkitpy/common/system/executive_mock.py 2021-10-30 17:09:52 UTC (rev 285081)
@@ -42,9 +42,15 @@
self.stdout = BytesIO(string_utils.encode(stdout))
self.stderr = BytesIO(string_utils.encode(stderr))
self.stdin = BytesIO()
- self.returncode = returncode
+ self._returncode = returncode
self._is_running = False
+ @property
+ def returncode(self):
+ if self._is_running:
+ return None
+ return self._returncode
+
def wait(self):
self._is_running = False
return self.returncode
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py (285080 => 285081)
--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py 2021-10-30 16:08:17 UTC (rev 285080)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py 2021-10-30 17:09:52 UTC (rev 285081)
@@ -199,8 +199,8 @@
def _spawn_process(self):
_log.debug('Starting %s server, cmd="%s"' % (self._name, self._start_cmd))
- process = self._executive.popen(self._start_cmd, env=self._env, shell=False, stderr=self._executive.PIPE)
- pid = process.pid
+ self._process = self._executive.popen(self._start_cmd, env=self._env, shell=False, stderr=self._executive.PIPE)
+ pid = self._process.pid
self._filesystem.write_text_file(self._pid_file, str(pid))
return pid
@@ -215,6 +215,11 @@
self._filesystem.remove(self._pid_file)
def _check_and_kill(self):
+ if self._process is not None:
+ self._process.poll()
+ if self._process.returncode is not None:
+ return True
+
if self._executive.check_running_pid(self._pid):
host = self._port_obj.host
if host.platform.is_win() and not host.platform.is_cygwin():
@@ -228,3 +233,12 @@
self._executive.kill_process(self._pid)
return False
return True
+
+ def _is_server_running_on_all_ports(self):
+ if self._process is not None:
+ self._process.poll()
+ if self._process.returncode is not None:
+ _log.debug("Server isn't running at all")
+ raise http_server_base.ServerError("Server exited")
+
+ return super(Lighttpd, self)._is_server_running_on_all_ports()
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py (285080 => 285081)
--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py 2021-10-30 16:08:17 UTC (rev 285080)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py 2021-10-30 17:09:52 UTC (rev 285081)
@@ -99,7 +99,7 @@
if sys.platform == 'cygwin':
# Starting the server takes longer time on Cygwin
- server_started = self._wait_for_action(self._is_server_running_on_all_ports, 60, 10)
+ server_started = self._wait_for_action(self._is_server_running_on_all_ports, 60)
else:
server_started = self._wait_for_action(self._is_server_running_on_all_ports)
@@ -191,7 +191,7 @@
full_path = self._filesystem.join(folder, file)
self._filesystem.remove(full_path)
- def _wait_for_action(self, action, wait_secs=20.0, sleep_secs=1.0):
+ def _wait_for_action(self, action, wait_secs=20.0, sleep_secs=0.1):
"""Repeat the action for wait_sec or until it succeeds, sleeping for sleep_secs
in between each attempt. Returns whether it succeeded."""
start_time = time.time()
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py (285080 => 285081)
--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py 2021-10-30 16:08:17 UTC (rev 285080)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py 2021-10-30 17:09:52 UTC (rev 285081)
@@ -157,6 +157,9 @@
self._wsout.close()
self._wsout = None
+ if self._process is not None:
+ self._process.poll()
+
if self._pid:
# kill_process will not kill the subprocesses, interrupt does the job.
self._executive.interrupt(self._pid)