Title: [121807] trunk/Tools
Revision
121807
Author
dpra...@chromium.org
Date
2012-07-03 16:11:18 -0700 (Tue, 03 Jul 2012)

Log Message

nrwt: moving child process logging code into manager_worker_broker
https://bugs.webkit.org/show_bug.cgi?id=90408

Reviewed by Ojan Vafai.

Users of manager_worker_broker should not have to be aware of
whether they're in the same process or different processes and
configure logging themselves; mwb should hide this complexity.
We can't quite do this completely/correctly yet, since the
manager expects to get a list of messages to log, but this
change fixes the worker side of it, at least.

This is just moving code around, there is no new functionality
and this should be covered by existing tests.

* Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py:
(AbstractWorker.__init__):
(_WorkerConnection.__init__):
(_WorkerConnection.post_message):
(_WorkerConnection):
(_WorkerConnection.set_up_logging):
(_WorkerConnection.clean_up_logging):
(_InlineWorkerConnection.run):
(_MultiProcessWorkerConnection.run):
(_WorkerLogHandler):
(_WorkerLogHandler.__init__):
(_WorkerLogHandler.emit):
* Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py:
(_TestWorker.run):
(_TestsMixin.handle_done):
* Scripts/webkitpy/layout_tests/controllers/worker.py:
(Worker.__init__):
(Worker.run):
(Worker._run_test):
(Worker.cleanup):
(Worker.run_single_test):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (121806 => 121807)


--- trunk/Tools/ChangeLog	2012-07-03 22:57:00 UTC (rev 121806)
+++ trunk/Tools/ChangeLog	2012-07-03 23:11:18 UTC (rev 121807)
@@ -1,3 +1,42 @@
+2012-07-03  Dirk Pranke  <dpra...@chromium.org>
+
+        nrwt: moving child process logging code into manager_worker_broker
+        https://bugs.webkit.org/show_bug.cgi?id=90408
+
+        Reviewed by Ojan Vafai.
+
+        Users of manager_worker_broker should not have to be aware of
+        whether they're in the same process or different processes and
+        configure logging themselves; mwb should hide this complexity.
+        We can't quite do this completely/correctly yet, since the
+        manager expects to get a list of messages to log, but this
+        change fixes the worker side of it, at least.
+
+        This is just moving code around, there is no new functionality
+        and this should be covered by existing tests.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py:
+        (AbstractWorker.__init__):
+        (_WorkerConnection.__init__):
+        (_WorkerConnection.post_message):
+        (_WorkerConnection):
+        (_WorkerConnection.set_up_logging):
+        (_WorkerConnection.clean_up_logging):
+        (_InlineWorkerConnection.run):
+        (_MultiProcessWorkerConnection.run):
+        (_WorkerLogHandler):
+        (_WorkerLogHandler.__init__):
+        (_WorkerLogHandler.emit):
+        * Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py:
+        (_TestWorker.run):
+        (_TestsMixin.handle_done):
+        * Scripts/webkitpy/layout_tests/controllers/worker.py:
+        (Worker.__init__):
+        (Worker.run):
+        (Worker._run_test):
+        (Worker.cleanup):
+        (Worker.run_single_test):
+
 2012-07-03  Tony Chang  <t...@chromium.org>
 
         [chromium] Don't archive build files generated by VS2010

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py (121806 => 121807)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py	2012-07-03 22:57:00 UTC (rev 121806)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py	2012-07-03 23:11:18 UTC (rev 121807)
@@ -69,12 +69,14 @@
 import logging
 import multiprocessing
 import optparse
+import os
 import Queue
 import sys
 import traceback
 
 
 from webkitpy.common.system import stack_utils
+from webkitpy.layout_tests.views import metered_stream
 
 
 _log = logging.getLogger(__name__)
@@ -277,6 +279,7 @@
         self._name = 'worker/%d' % worker_number
         self._done = False
         self._canceled = False
+        self._options = optparse.Values({'verbose': False})
 
     def name(self):
         return self._name
@@ -361,6 +364,9 @@
     def __init__(self, host, broker, worker_factory, worker_number):
         self._client = worker_factory(self, worker_number)
         self._host = host
+        self._log_messages = []
+        self._logger = None
+        self._log_handler = None
         _BrokerConnection.__init__(self, broker, self._client, ANY_WORKER_TOPIC, MANAGER_TOPIC)
 
     def name(self):
@@ -378,7 +384,34 @@
     def yield_to_broker(self):
         pass
 
+    def post_message(self, *args):
+        # FIXME: This is a hack until we can remove the log_messages arg from the manager.
+        if args[0] in ('finished_test', 'done'):
+            log_messages = self._log_messages
+            self._log_messages = []
+            args = args + tuple([log_messages])
+        super(_WorkerConnection, self).post_message(*args)
 
+    def set_up_logging(self):
+        self._logger = logging.root
+        # The unix multiprocessing implementation clones the MeteredStream log handler
+        # into the child process, so we need to remove it to avoid duplicate logging.
+        for h in self._logger.handlers:
+            # log handlers don't have names until python 2.7.
+            if getattr(h, 'name', '') == metered_stream.LOG_HANDLER_NAME:
+                self._logger.removeHandler(h)
+                break
+        self._logger.setLevel(logging.DEBUG if self._client._options.verbose else logging.INFO)
+        self._log_handler = _WorkerLogHandler(self)
+        self._logger.addHandler(self._log_handler)
+
+    def clean_up_logging(self):
+        if self._log_handler and self._logger:
+            self._logger.removeHandler(self._log_handler)
+        self._log_handler = None
+        self._logger = None
+
+
 class _InlineWorkerConnection(_WorkerConnection):
     def __init__(self, host, broker, manager_client, worker_factory, worker_number):
         _WorkerConnection.__init__(self, host, broker, worker_factory, worker_number)
@@ -397,7 +430,7 @@
     def run(self):
         self._alive = True
         try:
-            self._client.run(self._host, set_up_logging=False)
+            self._client.run(self._host)
         finally:
             self._alive = False
 
@@ -439,5 +472,18 @@
         self._proc.start()
 
     def run(self):
-        # FIXME: set_up_logging shouldn't be needed.
-        self._client.run(self._host, set_up_logging=True)
+        self.set_up_logging()
+        try:
+            self._client.run(self._host)
+        finally:
+            self.clean_up_logging()
+
+
+class _WorkerLogHandler(logging.Handler):
+    def __init__(self, worker):
+        logging.Handler.__init__(self)
+        self._worker = worker
+        self._pid = os.getpid()
+
+    def emit(self, record):
+        self._worker._log_messages.append(record)

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py (121806 => 121807)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py	2012-07-03 22:57:00 UTC (rev 121806)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py	2012-07-03 23:11:18 UTC (rev 121807)
@@ -69,7 +69,7 @@
         assert a_str == "hello, world"
         self._worker_connection.post_message('test', 2, 'hi, ' + self._thing_to_greet)
 
-    def run(self, host, set_up_logging):
+    def run(self, host):
         if self._starting_queue:
             self._starting_queue.put('')
 
@@ -102,7 +102,7 @@
     def is_done(self):
         return self._done
 
-    def handle_done(self, src):
+    def handle_done(self, src, log_messages):
         self._done = True
 
     def handle_test(self, src, an_int, a_str):

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py (121806 => 121807)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py	2012-07-03 22:57:00 UTC (rev 121806)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py	2012-07-03 23:11:18 UTC (rev 121807)
@@ -29,8 +29,6 @@
 """Handle messages from the Manager and executes actual tests."""
 
 import logging
-import os
-import sys
 import threading
 import time
 
@@ -39,7 +37,6 @@
 from webkitpy.layout_tests.controllers import single_test_runner
 from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.models import test_results
-from webkitpy.layout_tests.views import metered_stream
 
 
 _log = logging.getLogger(__name__)
@@ -57,9 +54,6 @@
         self._driver = None
         self._tests_run_file = None
         self._tests_run_filename = None
-        self._log_messages = []
-        self._logger = None
-        self._log_handler = None
 
     def __del__(self):
         self.cleanup()
@@ -76,29 +70,10 @@
         tests_run_filename = self._filesystem.join(self._results_directory, "tests_run%d.txt" % self._worker_number)
         self._tests_run_file = self._filesystem.open_text_file_for_writing(tests_run_filename)
 
-    def _set_up_logging(self):
-        self._logger = logging.getLogger()
-
-        # The unix multiprocessing implementation clones the MeteredStream log handler
-        # into the child process, so we need to remove it to avoid duplicate logging.
-        for h in self._logger.handlers:
-            # log handlers don't have names until python 2.7.
-            if getattr(h, 'name', '') == metered_stream.LOG_HANDLER_NAME:
-                self._logger.removeHandler(h)
-                break
-
-        self._logger.setLevel(logging.DEBUG if self._options.verbose else logging.INFO)
-        self._log_handler = _WorkerLogHandler(self)
-        self._logger.addHandler(self._log_handler)
-
-    def run(self, host, set_up_logging):
+    def run(self, host):
         if not host:
             host = Host()
 
-        # FIXME: this should move into manager_worker_broker.py.
-        if set_up_logging:
-            self._set_up_logging()
-
         options = self._options
         self._port = host.port_factory.get(options.platform, options)
 
@@ -110,7 +85,7 @@
             self.kill_driver()
             _log.debug("%s exiting" % self._name)
             self.cleanup()
-            self._worker_connection.post_message('done', self._log_messages)
+            self._worker_connection.post_message('done')
 
     def handle_test_list(self, src, list_name, test_list):
         start_time = time.time()
@@ -147,9 +122,7 @@
         result = self.run_test_with_timeout(test_input, test_timeout_sec)
 
         elapsed_time = time.time() - start
-        log_messages = self._log_messages
-        self._log_messages = []
-        self._worker_connection.post_message('finished_test', result, elapsed_time, log_messages)
+        self._worker_connection.post_message('finished_test', result, elapsed_time)
 
         self.clean_up_after_test(test_input, result)
 
@@ -159,10 +132,6 @@
         if self._tests_run_file:
             self._tests_run_file.close()
             self._tests_run_file = None
-        if self._log_handler and self._logger:
-            self._logger.removeHandler(self._log_handler)
-        self._log_handler = None
-        self._logger = None
 
     def timeout(self, test_input):
         """Compute the appropriate timeout value for a test."""
@@ -279,13 +248,3 @@
     def run_single_test(self, driver, test_input):
         return single_test_runner.run_single_test(self._port, self._options,
             test_input, driver, self._name)
-
-
-class _WorkerLogHandler(logging.Handler):
-    def __init__(self, worker):
-        logging.Handler.__init__(self)
-        self._worker = worker
-        self._pid = os.getpid()
-
-    def emit(self, record):
-        self._worker._log_messages.append(record)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to