Title: [176830] trunk/Tools
Revision
176830
Author
[email protected]
Date
2014-12-04 17:37:02 -0800 (Thu, 04 Dec 2014)

Log Message

Run http tests parallel
https://bugs.webkit.org/show_bug.cgi?id=138958

Reviewed by Daniel Bates.

Remove the concept of "locked shard". Now http tests are just like any other tests.
We start HTTP and WebSocket servers at the start if we need them, and terminate them
when done with all the tests (not when the last http test runs, which is unnecessarily
unpredictable).

This makes debug tests run in 8 minutes and 12 seconds on my Mac Pro. Without the
patch, they used to take over 15 minutes.

As part of the fix, we no longer pass the number of servers to Apache. I don't
think that these parameters did what we wanted them to do; Apache handles the load
just fine without them.

The change applies to all platforms. I fixed everything I could find on Mac, and
Ossy told me that he's been running http tests in parallel for a long time. If
there is increased instability for some ports, it will need to be fixed - there is
generally nothing special about http tests at this point, and most code is
cross-platform in WebKit2.

* Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
(LayoutTestRunner.__init__):
(LayoutTestRunner.run_tests):
(LayoutTestRunner.start_servers_with_lock):
(LayoutTestRunner._handle_started_test):
(Worker.handle):
(Sharder.__init__):
(Sharder.shard_tests):
(Sharder._shard_every_file):
(Sharder._shard_by_directory):
(LayoutTestRunner._handle_finished_test_list): Deleted.
(LayoutTestRunner._handle_finished_test_list.find): Deleted.
(Sharder._shard_in_two): Deleted.
(Sharder): Deleted.
(Sharder._resize_shards): Deleted.
(Sharder._resize_shards.divide_and_round_up): Deleted.
(Sharder._resize_shards.extract_and_flatten): Deleted.
(Sharder._resize_shards.split_at): Deleted.
* Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
(FakePrinter.print_workers_and_shards):
(LayoutTestRunnerTests.test_servers_started.start_http_server):
(LayoutTestRunnerTests.test_servers_started):
(SharderTests.get_shards):
(SharderTests.test_shard_by_dir):
(SharderTests.test_shard_every_file):
(SharderTests): Deleted.
(SharderTests.test_shard_in_two): Deleted.
(SharderTests.test_shard_in_two_has_no_locked_shards): Deleted.
(SharderTests.test_shard_in_two_has_no_unlocked_shards): Deleted.
(SharderTests.test_multiple_locked_shards): Deleted.
* Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
(ManagerTest.test_needs_servers.get_manager):
(ManagerTest.integration_test_needs_servers.get_manager):
(ManagerTest.test_look_for_new_crash_logs.get_manager):
(ManagerTest):
* Scripts/webkitpy/layout_tests/run_webkit_tests.py:
(_set_up_derived_options):
* Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
(RunTest.test_batch_size):
(RunTest.test_max_locked_shards): Deleted.
* Scripts/webkitpy/layout_tests/servers/apache_http_server.py:
(LayoutTestApacheHttpd.__init__):
* Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py:
(TestLayoutTestApacheHttpd.test_start_cmd):
* Scripts/webkitpy/layout_tests/servers/http_server.py:
(Lighttpd.__init__):
* Scripts/webkitpy/layout_tests/servers/http_server_base.py:
(HttpServerBase.__init__):
* Scripts/webkitpy/layout_tests/views/printing.py:
(Printer.print_workers_and_shards):
* Scripts/webkitpy/port/base.py:
(Port.default_child_processes):
(Port.to.start_http_server):
(Port.default_max_locked_shards): Deleted.
* Scripts/webkitpy/port/port_testcase.py:
(PortTestCase.make_port):
(PortTestCase.test_default_max_locked_shards): Deleted.
* Scripts/webkitpy/port/test.py:
(TestPort.start_http_server):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (176829 => 176830)


--- trunk/Tools/ChangeLog	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/ChangeLog	2014-12-05 01:37:02 UTC (rev 176830)
@@ -1,5 +1,90 @@
 2014-12-04  Alexey Proskuryakov  <[email protected]>
 
+        Run http tests parallel
+        https://bugs.webkit.org/show_bug.cgi?id=138958
+
+        Reviewed by Daniel Bates.
+
+        Remove the concept of "locked shard". Now http tests are just like any other tests.
+        We start HTTP and WebSocket servers at the start if we need them, and terminate them
+        when done with all the tests (not when the last http test runs, which is unnecessarily
+        unpredictable).
+
+        This makes debug tests run in 8 minutes and 12 seconds on my Mac Pro. Without the
+        patch, they used to take over 15 minutes.
+
+        As part of the fix, we no longer pass the number of servers to Apache. I don't
+        think that these parameters did what we wanted them to do; Apache handles the load
+        just fine without them.
+
+        The change applies to all platforms. I fixed everything I could find on Mac, and
+        Ossy told me that he's been running http tests in parallel for a long time. If
+        there is increased instability for some ports, it will need to be fixed - there is
+        generally nothing special about http tests at this point, and most code is
+        cross-platform in WebKit2.
+
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
+        (LayoutTestRunner.__init__):
+        (LayoutTestRunner.run_tests):
+        (LayoutTestRunner.start_servers_with_lock):
+        (LayoutTestRunner._handle_started_test):
+        (Worker.handle):
+        (Sharder.__init__):
+        (Sharder.shard_tests):
+        (Sharder._shard_every_file):
+        (Sharder._shard_by_directory):
+        (LayoutTestRunner._handle_finished_test_list): Deleted.
+        (LayoutTestRunner._handle_finished_test_list.find): Deleted.
+        (Sharder._shard_in_two): Deleted.
+        (Sharder): Deleted.
+        (Sharder._resize_shards): Deleted.
+        (Sharder._resize_shards.divide_and_round_up): Deleted.
+        (Sharder._resize_shards.extract_and_flatten): Deleted.
+        (Sharder._resize_shards.split_at): Deleted.
+        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py:
+        (FakePrinter.print_workers_and_shards):
+        (LayoutTestRunnerTests.test_servers_started.start_http_server):
+        (LayoutTestRunnerTests.test_servers_started):
+        (SharderTests.get_shards):
+        (SharderTests.test_shard_by_dir):
+        (SharderTests.test_shard_every_file):
+        (SharderTests): Deleted.
+        (SharderTests.test_shard_in_two): Deleted.
+        (SharderTests.test_shard_in_two_has_no_locked_shards): Deleted.
+        (SharderTests.test_shard_in_two_has_no_unlocked_shards): Deleted.
+        (SharderTests.test_multiple_locked_shards): Deleted.
+        * Scripts/webkitpy/layout_tests/controllers/manager_unittest.py:
+        (ManagerTest.test_needs_servers.get_manager):
+        (ManagerTest.integration_test_needs_servers.get_manager):
+        (ManagerTest.test_look_for_new_crash_logs.get_manager):
+        (ManagerTest):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (_set_up_derived_options):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (RunTest.test_batch_size):
+        (RunTest.test_max_locked_shards): Deleted.
+        * Scripts/webkitpy/layout_tests/servers/apache_http_server.py:
+        (LayoutTestApacheHttpd.__init__):
+        * Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py:
+        (TestLayoutTestApacheHttpd.test_start_cmd):
+        * Scripts/webkitpy/layout_tests/servers/http_server.py:
+        (Lighttpd.__init__):
+        * Scripts/webkitpy/layout_tests/servers/http_server_base.py:
+        (HttpServerBase.__init__):
+        * Scripts/webkitpy/layout_tests/views/printing.py:
+        (Printer.print_workers_and_shards):
+        * Scripts/webkitpy/port/base.py:
+        (Port.default_child_processes):
+        (Port.to.start_http_server):
+        (Port.default_max_locked_shards): Deleted.
+        * Scripts/webkitpy/port/port_testcase.py:
+        (PortTestCase.make_port):
+        (PortTestCase.test_default_max_locked_shards): Deleted.
+        * Scripts/webkitpy/port/test.py:
+        (TestPort.start_http_server):
+
+2014-12-04  Alexey Proskuryakov  <[email protected]>
+
         Don't lock perf tests in run-webkit-tests
         https://bugs.webkit.org/show_bug.cgi?id=139264
 

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -67,7 +67,7 @@
         self._printer = printer
         self._results_directory = results_directory
         self._test_is_slow = test_is_slow_fn
-        self._sharder = Sharder(self._port.split_test, self._options.max_locked_shards)
+        self._sharder = Sharder(self._port.split_test)
         self._filesystem = self._port.host.filesystem
 
         self._expectations = None
@@ -77,7 +77,6 @@
         self._retrying = False
 
         self._current_run_results = None
-        self._remaining_locked_shards = []
         self._has_http_lock = False
 
     def run_tests(self, expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, retrying):
@@ -90,7 +89,6 @@
         # FIXME: rename all variables to test_run_results or some such ...
         run_results = TestRunResults(self._expectations, len(test_inputs) + len(tests_to_skip))
         self._current_run_results = run_results
-        self._remaining_locked_shards = []
         self._has_http_lock = False
         self._printer.num_tests = len(test_inputs)
         self._printer.num_started = 0
@@ -104,23 +102,13 @@
             run_results.add(result, expected=True, test_is_slow=self._test_is_slow(test_name))
 
         self._printer.write_update('Sharding tests ...')
-        locked_shards, unlocked_shards = self._sharder.shard_tests(test_inputs, int(self._options.child_processes), self._options.fully_parallel)
+        all_shards = self._sharder.shard_tests(test_inputs, int(self._options.child_processes), self._options.fully_parallel)
 
-        # FIXME: We don't have a good way to coordinate the workers so that
-        # they don't try to run the shards that need a lock if we don't actually
-        # have the lock. The easiest solution at the moment is to grab the
-        # lock at the beginning of the run, and then run all of the locked
-        # shards first. This minimizes the time spent holding the lock, but
-        # means that we won't be running tests while we're waiting for the lock.
-        # If this becomes a problem in practice we'll need to change this.
+        if self._needs_http and self._options.http:
+            self.start_servers_with_lock()
 
-        all_shards = locked_shards + unlocked_shards
-        self._remaining_locked_shards = locked_shards
-        if locked_shards and self._options.http:
-            self.start_servers_with_lock(2 * min(num_workers, len(locked_shards)))
-
         num_workers = min(num_workers, len(all_shards))
-        self._printer.print_workers_and_shards(num_workers, len(all_shards), len(locked_shards))
+        self._printer.print_workers_and_shards(num_workers, len(all_shards))
 
         if self._options.dry_run:
             return run_results
@@ -197,12 +185,12 @@
 
         self._interrupt_if_at_failure_limits(run_results)
 
-    def start_servers_with_lock(self, number_of_servers):
+    def start_servers_with_lock(self):
         self._printer.write_update('Acquiring http lock ...')
         self._port.acquire_http_lock()
         if self._needs_http:
             self._printer.write_update('Starting HTTP server ...')
-            self._port.start_http_server(number_of_servers=number_of_servers)
+            self._port.start_http_server()
         if self._needs_websockets:
             self._printer.write_update('Starting WebSocket server ...')
             self._port.start_websocket_server()
@@ -229,19 +217,6 @@
     def _handle_started_test(self, worker_name, test_input, test_timeout_sec):
         self._printer.print_started_test(test_input.test_name)
 
-    def _handle_finished_test_list(self, worker_name, list_name):
-        def find(name, test_lists):
-            for i in range(len(test_lists)):
-                if test_lists[i].name == name:
-                    return i
-            return -1
-
-        index = find(list_name, self._remaining_locked_shards)
-        if index >= 0:
-            self._remaining_locked_shards.pop(index)
-            if not self._remaining_locked_shards:
-                self.stop_servers_with_lock()
-
     def _handle_finished_test(self, worker_name, result, log_messages=[]):
         self._update_summary_with_result(self._current_run_results, result)
 
@@ -281,7 +256,6 @@
         assert name == 'test_list'
         for test_input in test_inputs:
             self._run_test(test_input, test_list_name)
-        self._caller.post('finished_test_list', test_list_name)
 
     def _update_test_input(self, test_input):
         if test_input.reference_files is None:
@@ -452,9 +426,8 @@
 
 
 class Sharder(object):
-    def __init__(self, test_split_fn, max_locked_shards):
+    def __init__(self, test_split_fn):
         self._split = test_split_fn
-        self._max_locked_shards = max_locked_shards
 
     def shard_tests(self, test_inputs, num_workers, fully_parallel):
         """Groups tests into batches.
@@ -462,64 +435,37 @@
         continue to run together as most cross-tests dependencies tend to
         occur within the same directory.
         Return:
-            Two list of TestShards. The first contains tests that must only be
-            run under the server lock, the second can be run whenever.
+            A list of TestShards.
         """
 
         # FIXME: Move all of the sharding logic out of manager into its
         # own class or module. Consider grouping it with the chunking logic
         # in prepare_lists as well.
         if num_workers == 1:
-            return self._shard_in_two(test_inputs)
+            return [TestShard('all_tests', test_inputs)]
         elif fully_parallel:
             return self._shard_every_file(test_inputs)
         return self._shard_by_directory(test_inputs, num_workers)
 
-    def _shard_in_two(self, test_inputs):
-        """Returns two lists of shards, one with all the tests requiring a lock and one with the rest.
-
-        This is used when there's only one worker, to minimize the per-shard overhead."""
-        locked_inputs = []
-        unlocked_inputs = []
-        for test_input in test_inputs:
-            if test_input.needs_servers:
-                locked_inputs.append(test_input)
-            else:
-                unlocked_inputs.append(test_input)
-
-        locked_shards = []
-        unlocked_shards = []
-        if locked_inputs:
-            locked_shards = [TestShard('locked_tests', locked_inputs)]
-        if unlocked_inputs:
-            unlocked_shards = [TestShard('unlocked_tests', unlocked_inputs)]
-
-        return locked_shards, unlocked_shards
-
     def _shard_every_file(self, test_inputs):
-        """Returns two lists of shards, each shard containing a single test file.
+        """Returns a list of shards, each shard containing a single test file.
 
         This mode gets maximal parallelism at the cost of much higher flakiness."""
-        locked_shards = []
-        unlocked_shards = []
+        shards = []
         for test_input in test_inputs:
             # Note that we use a '.' for the shard name; the name doesn't really
             # matter, and the only other meaningful value would be the filename,
             # which would be really redundant.
-            if test_input.needs_servers:
-                locked_shards.append(TestShard('.', [test_input]))
-            else:
-                unlocked_shards.append(TestShard('.', [test_input]))
+            shards.append(TestShard('.', [test_input]))
 
-        return locked_shards, unlocked_shards
+        return shards
 
     def _shard_by_directory(self, test_inputs, num_workers):
-        """Returns two lists of shards, each shard containing all the files in a directory.
+        """Returns a lists of shards, each shard containing all the files in a directory.
 
         This is the default mode, and gets as much parallelism as we can while
         minimizing flakiness caused by inter-test dependencies."""
-        locked_shards = []
-        unlocked_shards = []
+        shards = []
         tests_by_dir = {}
         # FIXME: Given that the tests are already sorted by directory,
         # we can probably rewrite this to be clearer and faster.
@@ -530,53 +476,9 @@
 
         for directory, test_inputs in tests_by_dir.iteritems():
             shard = TestShard(directory, test_inputs)
-            if test_inputs[0].needs_servers:
-                locked_shards.append(shard)
-            else:
-                unlocked_shards.append(shard)
+            shards.append(shard)
 
         # Sort the shards by directory name.
-        locked_shards.sort(key=lambda shard: shard.name)
-        unlocked_shards.sort(key=lambda shard: shard.name)
+        shards.sort(key=lambda shard: shard.name)
 
-        # Put a ceiling on the number of locked shards, so that we
-        # don't hammer the servers too badly.
-
-        # FIXME: For now, limit to one shard or set it
-        # with the --max-locked-shards. After testing to make sure we
-        # can handle multiple shards, we should probably do something like
-        # limit this to no more than a quarter of all workers, e.g.:
-        # return max(math.ceil(num_workers / 4.0), 1)
-        return (self._resize_shards(locked_shards, self._max_locked_shards, 'locked_shard'),
-                unlocked_shards)
-
-    def _resize_shards(self, old_shards, max_new_shards, shard_name_prefix):
-        """Takes a list of shards and redistributes the tests into no more
-        than |max_new_shards| new shards."""
-
-        # This implementation assumes that each input shard only contains tests from a
-        # single directory, and that tests in each shard must remain together; as a
-        # result, a given input shard is never split between output shards.
-        #
-        # Each output shard contains the tests from one or more input shards and
-        # hence may contain tests from multiple directories.
-
-        def divide_and_round_up(numerator, divisor):
-            return int(math.ceil(float(numerator) / divisor))
-
-        def extract_and_flatten(shards):
-            test_inputs = []
-            for shard in shards:
-                test_inputs.extend(shard.test_inputs)
-            return test_inputs
-
-        def split_at(seq, index):
-            return (seq[:index], seq[index:])
-
-        num_old_per_new = divide_and_round_up(len(old_shards), max_new_shards)
-        new_shards = []
-        remaining_shards = old_shards
-        while remaining_shards:
-            some_shards, remaining_shards = split_at(remaining_shards, num_old_per_new)
-            new_shards.append(TestShard('%s_%d' % (shard_name_prefix, len(new_shards) + 1), extract_and_flatten(some_shards)))
-        return new_shards
+        return shards

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner_unittest.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -51,7 +51,7 @@
     def print_expected(self, run_results, get_tests_with_result_type):
         pass
 
-    def print_workers_and_shards(self, num_workers, num_shards, num_locked_shards):
+    def print_workers_and_shards(self, num_workers, num_shards):
         pass
 
     def print_started_test(self, test_name):
@@ -166,7 +166,7 @@
 
     def test_servers_started(self):
 
-        def start_http_server(number_of_servers=None):
+        def start_http_server():
             self.http_started = True
 
         def start_websocket_server():
@@ -189,7 +189,7 @@
         runner = self._runner(port=port)
         runner._needs_http = True
         runner._needs_websockets = False
-        runner.start_servers_with_lock(number_of_servers=4)
+        runner.start_servers_with_lock()
         self.assertEqual(self.http_started, True)
         self.assertEqual(self.websocket_started, False)
         runner.stop_servers_with_lock()
@@ -199,7 +199,7 @@
         self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False
         runner._needs_http = True
         runner._needs_websockets = True
-        runner.start_servers_with_lock(number_of_servers=4)
+        runner.start_servers_with_lock()
         self.assertEqual(self.http_started, True)
         self.assertEqual(self.websocket_started, True)
         runner.stop_servers_with_lock()
@@ -209,7 +209,7 @@
         self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False
         runner._needs_http = False
         runner._needs_websockets = False
-        runner.start_servers_with_lock(number_of_servers=4)
+        runner.start_servers_with_lock()
         self.assertEqual(self.http_started, False)
         self.assertEqual(self.websocket_started, False)
         runner.stop_servers_with_lock()
@@ -234,9 +234,9 @@
     def get_test_input(self, test_file):
         return TestInput(test_file, needs_servers=(test_file.startswith('http')))
 
-    def get_shards(self, num_workers, fully_parallel, test_list=None, max_locked_shards=1):
+    def get_shards(self, num_workers, fully_parallel, test_list=None):
         port = TestPort(MockSystemHost())
-        self.sharder = Sharder(port.split_test, max_locked_shards)
+        self.sharder = Sharder(port.split_test)
         test_list = test_list or self.test_list
         return self.sharder.shard_tests([self.get_test_input(test) for test in test_list], num_workers, fully_parallel)
 
@@ -249,80 +249,27 @@
                               expected_test_names)
 
     def test_shard_by_dir(self):
-        locked, unlocked = self.get_shards(num_workers=2, fully_parallel=False)
+        result = self.get_shards(num_workers=2, fully_parallel=False)
 
-        # Note that although there are tests in multiple dirs that need locks,
-        # they are crammed into a single shard in order to reduce the # of
-        # workers hitting the server at once.
-        self.assert_shards(locked,
-             [('locked_shard_1',
-               ['http/tests/security/view-source-no-refresh.html',
-                'http/tests/websocket/tests/unicode.htm',
-                'http/tests/websocket/tests/websocket-protocol-ignored.html',
-                'http/tests/xmlhttprequest/supported-xml-content-types.html'])])
-        self.assert_shards(unlocked,
+        self.assert_shards(result,
             [('animations', ['animations/keyframes.html']),
              ('dom/html/level2/html', ['dom/html/level2/html/HTMLAnchorElement03.html',
                                       'dom/html/level2/html/HTMLAnchorElement06.html']),
              ('fast/css', ['fast/css/display-none-inline-style-change-crash.html']),
+             ('http/tests/security', ['http/tests/security/view-source-no-refresh.html']),
+             ('http/tests/websocket/tests', ['http/tests/websocket/tests/unicode.htm', 'http/tests/websocket/tests/websocket-protocol-ignored.html']),
+             ('http/tests/xmlhttprequest', ['http/tests/xmlhttprequest/supported-xml-content-types.html']),
              ('ietestcenter/_javascript_', ['ietestcenter/_javascript_/11.1.5_4-4-c-1.html'])])
 
     def test_shard_every_file(self):
-        locked, unlocked = self.get_shards(num_workers=2, fully_parallel=True)
-        self.assert_shards(locked,
+        result = self.get_shards(num_workers=2, fully_parallel=True)
+        self.assert_shards(result,
             [('.', ['http/tests/websocket/tests/unicode.htm']),
+             ('.', ['animations/keyframes.html']),
              ('.', ['http/tests/security/view-source-no-refresh.html']),
              ('.', ['http/tests/websocket/tests/websocket-protocol-ignored.html']),
-             ('.', ['http/tests/xmlhttprequest/supported-xml-content-types.html'])]),
-        self.assert_shards(unlocked,
-            [('.', ['animations/keyframes.html']),
              ('.', ['fast/css/display-none-inline-style-change-crash.html']),
+             ('.', ['http/tests/xmlhttprequest/supported-xml-content-types.html']),
              ('.', ['dom/html/level2/html/HTMLAnchorElement03.html']),
              ('.', ['ietestcenter/_javascript_/11.1.5_4-4-c-1.html']),
              ('.', ['dom/html/level2/html/HTMLAnchorElement06.html'])])
-
-    def test_shard_in_two(self):
-        locked, unlocked = self.get_shards(num_workers=1, fully_parallel=False)
-        self.assert_shards(locked,
-            [('locked_tests',
-              ['http/tests/websocket/tests/unicode.htm',
-               'http/tests/security/view-source-no-refresh.html',
-               'http/tests/websocket/tests/websocket-protocol-ignored.html',
-               'http/tests/xmlhttprequest/supported-xml-content-types.html'])])
-        self.assert_shards(unlocked,
-            [('unlocked_tests',
-              ['animations/keyframes.html',
-               'fast/css/display-none-inline-style-change-crash.html',
-               'dom/html/level2/html/HTMLAnchorElement03.html',
-               'ietestcenter/_javascript_/11.1.5_4-4-c-1.html',
-               'dom/html/level2/html/HTMLAnchorElement06.html'])])
-
-    def test_shard_in_two_has_no_locked_shards(self):
-        locked, unlocked = self.get_shards(num_workers=1, fully_parallel=False,
-             test_list=['animations/keyframe.html'])
-        self.assertEqual(len(locked), 0)
-        self.assertEqual(len(unlocked), 1)
-
-    def test_shard_in_two_has_no_unlocked_shards(self):
-        locked, unlocked = self.get_shards(num_workers=1, fully_parallel=False,
-             test_list=['http/tests/websocket/tests/unicode.htm'])
-        self.assertEqual(len(locked), 1)
-        self.assertEqual(len(unlocked), 0)
-
-    def test_multiple_locked_shards(self):
-        locked, unlocked = self.get_shards(num_workers=4, fully_parallel=False, max_locked_shards=2)
-        self.assert_shards(locked,
-            [('locked_shard_1',
-              ['http/tests/security/view-source-no-refresh.html',
-               'http/tests/websocket/tests/unicode.htm',
-               'http/tests/websocket/tests/websocket-protocol-ignored.html']),
-             ('locked_shard_2',
-              ['http/tests/xmlhttprequest/supported-xml-content-types.html'])])
-
-        locked, unlocked = self.get_shards(num_workers=4, fully_parallel=False)
-        self.assert_shards(locked,
-            [('locked_shard_1',
-              ['http/tests/security/view-source-no-refresh.html',
-               'http/tests/websocket/tests/unicode.htm',
-               'http/tests/websocket/tests/websocket-protocol-ignored.html',
-               'http/tests/xmlhttprequest/supported-xml-content-types.html'])])

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_unittest.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -46,7 +46,7 @@
         def get_manager():
             port = Mock()  # FIXME: Use a tighter mock.
             port.TEST_PATH_SEPARATOR = '/'
-            manager = Manager(port, options=MockOptions(http=True, max_locked_shards=1), printer=Mock())
+            manager = Manager(port, options=MockOptions(http=True), printer=Mock())
             return manager
 
         manager = get_manager()
@@ -59,7 +59,7 @@
         def get_manager():
             host = MockHost()
             port = host.port_factory.get()
-            manager = Manager(port, options=MockOptions(test_list=None, http=True, max_locked_shards=1), printer=Mock())
+            manager = Manager(port, options=MockOptions(test_list=None, http=True), printer=Mock())
             return manager
 
         manager = get_manager()
@@ -79,7 +79,7 @@
         def get_manager():
             host = MockHost()
             port = host.port_factory.get('test-mac-leopard')
-            manager = Manager(port, options=MockOptions(test_list=None, http=True, max_locked_shards=1), printer=Mock())
+            manager = Manager(port, options=MockOptions(test_list=None, http=True), printer=Mock())
             return manager
         host = MockHost()
         port = host.port_factory.get('test-mac-leopard')

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -331,9 +331,6 @@
     if not options.child_processes:
         options.child_processes = os.environ.get("WEBKIT_TEST_CHILD_PROCESSES",
                                                  str(port.default_child_processes()))
-    if not options.max_locked_shards:
-        options.max_locked_shards = int(os.environ.get("WEBKIT_TEST_MAX_LOCKED_SHARDS",
-                                                       str(port.default_max_locked_shards())))
 
     if not options.configuration:
         options.configuration = port.default_configuration()

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -224,21 +224,6 @@
         for batch in batch_tests_run:
             self.assertTrue(len(batch) <= 2, '%s had too many tests' % ', '.join(batch))
 
-    def test_max_locked_shards(self):
-        # Tests for the default of using one locked shard even in the case of more than one child process.
-        if not self.should_test_processes:
-            return
-        save_env_webkit_test_max_locked_shards = None
-        if "WEBKIT_TEST_MAX_LOCKED_SHARDS" in os.environ:
-            save_env_webkit_test_max_locked_shards = os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"]
-            del os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"]
-        _, regular_output, _ = logging_run(['--debug-rwt-logging', '--child-processes', '2'], shared_port=False)
-        try:
-            self.assertTrue(any(['1 locked' in line for line in regular_output.buflist]))
-        finally:
-            if save_env_webkit_test_max_locked_shards:
-                os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"] = save_env_webkit_test_max_locked_shards
-
     def test_child_processes_2(self):
         if self.should_test_processes:
             _, regular_output, _ = logging_run(

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -42,12 +42,12 @@
 
 
 class LayoutTestApacheHttpd(http_server_base.HttpServerBase):
-    def __init__(self, port_obj, output_dir, additional_dirs=None, number_of_servers=None):
+    def __init__(self, port_obj, output_dir, additional_dirs=None):
         """Args:
           port_obj: handle to the platform-specific routines
           output_dir: the absolute path to the layout test result directory
         """
-        http_server_base.HttpServerBase.__init__(self, port_obj, number_of_servers)
+        http_server_base.HttpServerBase.__init__(self, port_obj)
         # We use the name "httpd" instead of "apache" to make our paths (e.g. the pid file: /tmp/WebKit/httpd.pid)
         # match old-run-webkit-tests: https://bugs.webkit.org/show_bug.cgi?id=63956
         self._name = 'httpd'
@@ -115,11 +115,6 @@
                         '-c', "\'RemoveHandler .cgi .pl\'",
                         '-c', "\'</Location>\'"]
 
-        if self._number_of_servers:
-            start_cmd += ['-c', "\'StartServers %d\'" % self._number_of_servers,
-                          '-c', "\'MinSpareServers %d\'" % self._number_of_servers,
-                          '-c', "\'MaxSpareServers %d\'" % self._number_of_servers]
-
         stop_cmd = [executable,
             '-f', "\"%s\"" % self._get_apache_config_file_path(test_dir, output_dir),
             '-c', "\'PidFile %s'" % self._pid_file,

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/apache_http_server_unittest.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -53,7 +53,7 @@
         test_port = test.TestPort(host)
         host.filesystem.write_text_file(test_port._path_to_apache_config_file(), '')
 
-        server = LayoutTestApacheHttpd(test_port, "/mock/output_dir", number_of_servers=4)
+        server = LayoutTestApacheHttpd(test_port, "/mock/output_dir")
         server._check_that_all_ports_are_available = lambda: True
         server._is_server_running_on_all_ports = lambda: True
         server._wait_for_action = fake_pid
@@ -64,7 +64,4 @@
             server.stop()
         finally:
             _, _, logs = oc.restore_output()
-        self.assertIn("StartServers 4", logs)
-        self.assertIn("MinSpareServers 4", logs)
-        self.assertIn("MaxSpareServers 4", logs)
         self.assertTrue(host.filesystem.exists("/mock/output_dir/httpd.conf"))

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -42,12 +42,12 @@
 
     def __init__(self, port_obj, output_dir, background="" port=None,
                  root=None, run_background=None, additional_dirs=None,
-                 layout_tests_dir=None, number_of_servers=None):
+                 layout_tests_dir=None):
         """Args:
           output_dir: the absolute path to the layout test result directory
         """
         # Webkit tests
-        http_server_base.HttpServerBase.__init__(self, port_obj, number_of_servers)
+        http_server_base.HttpServerBase.__init__(self, port_obj)
         self._name = 'lighttpd'
         self._output_dir = output_dir
         self._port = port

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/http_server_base.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -46,7 +46,7 @@
 class HttpServerBase(object):
     """A skeleton class for starting and stopping servers used by the layout tests."""
 
-    def __init__(self, port_obj, number_of_servers=None):
+    def __init__(self, port_obj):
         self._executive = port_obj._executive
         self._filesystem = port_obj._filesystem
         self._name = '<virtual>'
@@ -54,7 +54,6 @@
         self._pid = None
         self._pid_file = None
         self._port_obj = port_obj
-        self._number_of_servers = number_of_servers
 
         # We need a non-checkout-dependent place to put lock files, etc. We
         # don't use the Python default on the Mac because it defaults to a

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -110,14 +110,14 @@
         self._print_expected_results_of_type(run_results, test_expectations.FLAKY, "flaky", tests_with_result_type_callback)
         self._print_debug('')
 
-    def print_workers_and_shards(self, num_workers, num_shards, num_locked_shards):
+    def print_workers_and_shards(self, num_workers, num_shards):
         driver_name = self._port.driver_name()
         if num_workers == 1:
             self._print_default("Running 1 %s." % driver_name)
             self._print_debug("(%s)." % grammar.pluralize(num_shards, "shard"))
         else:
             self._print_default("Running %s in parallel." % (grammar.pluralize(num_workers, driver_name)))
-            self._print_debug("(%d shards; %d locked)." % (num_shards, num_locked_shards))
+            self._print_debug("(%d shards)." % num_shards)
         self._print_default('')
 
     def _print_expected_results_of_type(self, run_results, result_type, result_type_str, tests_with_result_type_callback):

Modified: trunk/Tools/Scripts/webkitpy/port/base.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/port/base.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/port/base.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -159,10 +159,6 @@
         """Return the number of DumpRenderTree instances to use for this port."""
         return self._executive.cpu_count()
 
-    def default_max_locked_shards(self):
-        """Return the number of "locked" shards to run in parallel (like the http tests)."""
-        return 1
-
     def worker_startup_delay_secs(self):
         # FIXME: If we start workers up too quickly, DumpRenderTree appears
         # to thrash on something and time out its first few tests. Until
@@ -877,16 +873,16 @@
         storage, it should override this method."""
         pass
 
-    def start_http_server(self, additional_dirs=None, number_of_servers=None):
+    def start_http_server(self, additional_dirs=None):
         """Start a web server. Raise an error if it can't start or is already running.
 
         Ports can stub this out if they don't need a web server to be running."""
         assert not self._http_server, 'Already running an http server.'
 
         if self._uses_apache():
-            server = apache_http_server.LayoutTestApacheHttpd(self, self.results_directory(), additional_dirs=additional_dirs, number_of_servers=number_of_servers)
+            server = apache_http_server.LayoutTestApacheHttpd(self, self.results_directory(), additional_dirs=additional_dirs)
         else:
-            server = http_server.Lighttpd(self, self.results_directory(), additional_dirs=additional_dirs, number_of_servers=number_of_servers)
+            server = http_server.Lighttpd(self, self.results_directory(), additional_dirs=additional_dirs)
 
         server.start()
         self._http_server = server

Modified: trunk/Tools/Scripts/webkitpy/port/port_testcase.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/port/port_testcase.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/port/port_testcase.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -91,13 +91,6 @@
         port._config.build_directory = lambda configuration: '/mock-build'
         return port
 
-    def test_default_max_locked_shards(self):
-        port = self.make_port()
-        port.default_child_processes = lambda: 16
-        self.assertEqual(port.default_max_locked_shards(), 1)
-        port.default_child_processes = lambda: 2
-        self.assertEqual(port.default_max_locked_shards(), 1)
-
     def test_default_timeout_ms(self):
         self.assertEqual(self.make_port(options=MockOptions(configuration='Release')).default_timeout_ms(), 35000)
         self.assertEqual(self.make_port(options=MockOptions(configuration='Debug')).default_timeout_ms(), 35000)

Modified: trunk/Tools/Scripts/webkitpy/port/test.py (176829 => 176830)


--- trunk/Tools/Scripts/webkitpy/port/test.py	2014-12-05 01:23:51 UTC (rev 176829)
+++ trunk/Tools/Scripts/webkitpy/port/test.py	2014-12-05 01:37:02 UTC (rev 176830)
@@ -463,7 +463,7 @@
     def _driver_class(self):
         return TestDriver
 
-    def start_http_server(self, additional_dirs=None, number_of_servers=None):
+    def start_http_server(self, additional_dirs=None):
         pass
 
     def start_websocket_server(self):
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to