⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278624 in webkit


Ignore:
Timestamp:
Jun 8, 2021, 12:58:00 PM (5 years ago)
Author:
Fujii Hironori
Message:

run-webkit-tests: TaskPool reports PicklingError for Windows Python
https://bugs.webkit.org/show_bug.cgi?id=226710

Reviewed by Jonathan Bedard.

Since r278454 changed run-webkit-tests to use TaskPool,
run-webkit-tests reported PicklingError for Windows Python. It
couldn't pickle Port object. This issue happened on multi-core PC,
but on single CPU tester bot machines.

WrappedPopen couldn't be pickled because it was defined as an
inner class. It should be defined at the top-level.

The instance variables _web_platform_test_server,
_websocket_server_temporary_directory, and
_websocket_secure_server of Port object aren't pickleable. Make
them class variables.

  • Scripts/webkitpy/common/system/executive.py:

(WrappedPopen):
(Executive.WrappedPopen):

  • Scripts/webkitpy/port/base.py:

(Port):
(Port.init):
(Port.ports_to_forward):
(Port.is_websocket_server_running):
(Port.is_wpt_server_running):
(Port.start_websocket_server):
(Port.start_web_platform_test_server):
(Port.stop_websocket_server):
(Port.stop_web_platform_test_server):

Location:
trunk/Tools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r278621 r278624  
     12021-06-08  Fujii Hironori  <Hironori.Fujii@sony.com>
     2
     3        run-webkit-tests: TaskPool reports PicklingError for Windows Python
     4        https://bugs.webkit.org/show_bug.cgi?id=226710
     5
     6        Reviewed by Jonathan Bedard.
     7
     8        Since r278454 changed run-webkit-tests to use TaskPool,
     9        run-webkit-tests reported PicklingError for Windows Python. It
     10        couldn't pickle Port object. This issue happened on multi-core PC,
     11        but on single CPU tester bot machines.
     12
     13        WrappedPopen couldn't be pickled because it was defined as an
     14        inner class. It should be defined at the top-level.
     15
     16        The instance variables _web_platform_test_server,
     17        _websocket_server_temporary_directory, and
     18        _websocket_secure_server of Port object aren't pickleable. Make
     19        them class variables.
     20
     21        * Scripts/webkitpy/common/system/executive.py:
     22        (WrappedPopen):
     23        (Executive.WrappedPopen):
     24        * Scripts/webkitpy/port/base.py:
     25        (Port):
     26        (Port.__init__):
     27        (Port.ports_to_forward):
     28        (Port.is_websocket_server_running):
     29        (Port.is_wpt_server_running):
     30        (Port.start_websocket_server):
     31        (Port.start_web_platform_test_server):
     32        (Port.stop_websocket_server):
     33        (Port.stop_web_platform_test_server):
     34
    1352021-06-08  Antti Koivisto  <antti@apple.com>
    236
  • trunk/Tools/Scripts/webkitpy/common/system/executive.py

    r276374 r278624  
    8282
    8383
     84class WrappedPopen(object):
     85    def __init__(self, popen):
     86        for attribute in dir(popen):
     87            if attribute.startswith('__'):
     88                continue
     89            setattr(self, attribute, getattr(popen, attribute))
     90
     91    def __enter__(self):
     92        return self
     93
     94    def __exit__(self, *args):
     95        self.wait()
     96
     97
    8498class Executive(AbstractExecutive):
    8599    PIPE = subprocess.PIPE
    86100    STDOUT = subprocess.STDOUT
    87 
    88     class WrappedPopen(object):
    89         def __init__(self, popen):
    90             for attribute in dir(popen):
    91                 if attribute.startswith('__'):
    92                     continue
    93                 setattr(self, attribute, getattr(popen, attribute))
    94 
    95         def __enter__(self):
    96             return self
    97 
    98         def __exit__(self, *args):
    99             self.wait()
    100101
    101102    def __init__(self):
     
    535536        result = subprocess.Popen(string_args, env=env, **kwargs)
    536537        if not callable(getattr(result, "__enter__", None)) and not callable(getattr(result, "__exit__", None)):
    537             return self.WrappedPopen(result)
     538            return WrappedPopen(result)
    538539        return result
    539540
  • trunk/Tools/Scripts/webkitpy/port/base.py

    r278454 r278624  
    8383
    8484    helper = None
     85    _web_platform_test_server = None
     86    _websocket_secure_server = None
     87    _websocket_server = None
    8588
    8689    @classmethod
     
    119122
    120123        self._http_server = None
    121         self._websocket_server = None
    122         self._websocket_secure_server = None
    123         self._web_platform_test_server = None
    124124        self._image_differ = None
    125125        self._server_process_constructor = server_process.ServerProcess  # overridable for testing
     
    864864        if self._http_server:
    865865            ports.extend(self._http_server.ports_to_forward())
    866         if self._websocket_server:
    867             ports.extend(self._websocket_server.ports_to_forward())
    868         if self._websocket_server:
    869             ports.extend(self._websocket_secure_server.ports_to_forward())
    870         if self._web_platform_test_server:
    871             ports.extend(self._web_platform_test_server.ports_to_forward())
     866        if Port._websocket_server:
     867            ports.extend(Port._websocket_server.ports_to_forward())
     868        if Port._websocket_server:
     869            ports.extend(Port._websocket_secure_server.ports_to_forward())
     870        if Port._web_platform_test_server:
     871            ports.extend(Port._web_platform_test_server.ports_to_forward())
    872872        return ports
    873873
     
    895895
    896896    def is_websocket_server_running(self):
    897         if self._websocket_server:
     897        if Port._websocket_server:
    898898            return True
    899899        return websocket_server.is_web_socket_server_running()
    900900
    901901    def is_wpt_server_running(self):
    902         if self._web_platform_test_server:
     902        if Port._web_platform_test_server:
    903903            return True
    904904        return web_platform_test_server.is_wpt_server_running(self)
     
    908908
    909909        Ports can stub this out if they don't need a websocket server to be running."""
    910         assert not self._websocket_server, 'Already running a websocket server.'
     910        assert not Port._websocket_server, 'Already running a websocket server.'
    911911
    912912        server = websocket_server.PyWebSocket(self, self.results_directory())
    913913        server.start()
    914         self._websocket_server = server
     914        Port._websocket_server = server
    915915
    916916        websocket_server_temporary_directory = self._filesystem.mkdtemp(prefix='webkitpy-websocket-server')
    917         self._websocket_server_temporary_directory = websocket_server_temporary_directory
     917        Port._websocket_server_temporary_directory = websocket_server_temporary_directory
    918918
    919919        pem_file = self._filesystem.join(self.layout_tests_dir(), "http", "conf", "webkit-httpd.pem")
     
    924924        self._filesystem.write_text_file(private_key_file, pem.private_key)
    925925
    926         secure_server = self._websocket_secure_server = websocket_server.PyWebSocket(self, self.results_directory(),
     926        secure_server = Port._websocket_secure_server = websocket_server.PyWebSocket(self, self.results_directory(),
    927927            use_tls=True, port=websocket_server.PyWebSocket.DEFAULT_WSS_PORT, private_key=private_key_file, certificate=certificate_file)
    928928        secure_server.start()
    929         self._websocket_secure_server = secure_server
     929        Port._websocket_secure_server = secure_server
    930930
    931931    def start_web_platform_test_server(self, additional_dirs=None, number_of_servers=None):
    932         assert not self._web_platform_test_server, 'Already running a Web Platform Test server.'
    933 
    934         self._web_platform_test_server = web_platform_test_server.WebPlatformTestServer(self, "wptwk")
    935         self._web_platform_test_server.start()
     932        assert not Port._web_platform_test_server, 'Already running a Web Platform Test server.'
     933
     934        Port._web_platform_test_server = web_platform_test_server.WebPlatformTestServer(self, "wptwk")
     935        Port._web_platform_test_server.start()
    936936
    937937    def web_platform_test_server_doc_root(self):
     
    972972    def stop_websocket_server(self):
    973973        """Shut down the websocket server if it is running. Do nothing if it isn't."""
    974         if self._websocket_server:
    975             self._websocket_server.stop()
    976             self._websocket_server = None
    977         if self._websocket_secure_server:
    978             self._websocket_secure_server.stop()
    979             self._websocket_secure_server = None
    980         if self._websocket_server_temporary_directory:
    981             self._filesystem.rmtree(str(self._websocket_server_temporary_directory))
     974        if Port._websocket_server:
     975            Port._websocket_server.stop()
     976            Port._websocket_server = None
     977        if Port._websocket_secure_server:
     978            Port._websocket_secure_server.stop()
     979            Port._websocket_secure_server = None
     980        if Port._websocket_server_temporary_directory:
     981            self._filesystem.rmtree(str(Port._websocket_server_temporary_directory))
    982982
    983983    def stop_web_platform_test_server(self):
    984         if self._web_platform_test_server:
    985             self._web_platform_test_server.stop()
    986             self._web_platform_test_server = None
     984        if Port._web_platform_test_server:
     985            Port._web_platform_test_server.stop()
     986            Port._web_platform_test_server = None
    987987
    988988    def exit_code_from_summarized_results(self, unexpected_results):
Note: See TracChangeset for help on using the changeset viewer.