Title: [285081] trunk/Tools
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)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to