Changeset 121807 in webkit
- Timestamp:
- Jul 3, 2012 4:11:18 PM (12 years ago)
- Location:
- trunk/Tools
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r121802 r121807 1 2012-07-03 Dirk Pranke <dpranke@chromium.org> 2 3 nrwt: moving child process logging code into manager_worker_broker 4 https://bugs.webkit.org/show_bug.cgi?id=90408 5 6 Reviewed by Ojan Vafai. 7 8 Users of manager_worker_broker should not have to be aware of 9 whether they're in the same process or different processes and 10 configure logging themselves; mwb should hide this complexity. 11 We can't quite do this completely/correctly yet, since the 12 manager expects to get a list of messages to log, but this 13 change fixes the worker side of it, at least. 14 15 This is just moving code around, there is no new functionality 16 and this should be covered by existing tests. 17 18 * Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py: 19 (AbstractWorker.__init__): 20 (_WorkerConnection.__init__): 21 (_WorkerConnection.post_message): 22 (_WorkerConnection): 23 (_WorkerConnection.set_up_logging): 24 (_WorkerConnection.clean_up_logging): 25 (_InlineWorkerConnection.run): 26 (_MultiProcessWorkerConnection.run): 27 (_WorkerLogHandler): 28 (_WorkerLogHandler.__init__): 29 (_WorkerLogHandler.emit): 30 * Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py: 31 (_TestWorker.run): 32 (_TestsMixin.handle_done): 33 * Scripts/webkitpy/layout_tests/controllers/worker.py: 34 (Worker.__init__): 35 (Worker.run): 36 (Worker._run_test): 37 (Worker.cleanup): 38 (Worker.run_single_test): 39 1 40 2012-07-03 Tony Chang <tony@chromium.org> 2 41 -
trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py
r121509 r121807 70 70 import multiprocessing 71 71 import optparse 72 import os 72 73 import Queue 73 74 import sys … … 76 77 77 78 from webkitpy.common.system import stack_utils 79 from webkitpy.layout_tests.views import metered_stream 78 80 79 81 … … 278 280 self._done = False 279 281 self._canceled = False 282 self._options = optparse.Values({'verbose': False}) 280 283 281 284 def name(self): … … 362 365 self._client = worker_factory(self, worker_number) 363 366 self._host = host 367 self._log_messages = [] 368 self._logger = None 369 self._log_handler = None 364 370 _BrokerConnection.__init__(self, broker, self._client, ANY_WORKER_TOPIC, MANAGER_TOPIC) 365 371 … … 378 384 def yield_to_broker(self): 379 385 pass 386 387 def post_message(self, *args): 388 # FIXME: This is a hack until we can remove the log_messages arg from the manager. 389 if args[0] in ('finished_test', 'done'): 390 log_messages = self._log_messages 391 self._log_messages = [] 392 args = args + tuple([log_messages]) 393 super(_WorkerConnection, self).post_message(*args) 394 395 def set_up_logging(self): 396 self._logger = logging.root 397 # The unix multiprocessing implementation clones the MeteredStream log handler 398 # into the child process, so we need to remove it to avoid duplicate logging. 399 for h in self._logger.handlers: 400 # log handlers don't have names until python 2.7. 401 if getattr(h, 'name', '') == metered_stream.LOG_HANDLER_NAME: 402 self._logger.removeHandler(h) 403 break 404 self._logger.setLevel(logging.DEBUG if self._client._options.verbose else logging.INFO) 405 self._log_handler = _WorkerLogHandler(self) 406 self._logger.addHandler(self._log_handler) 407 408 def clean_up_logging(self): 409 if self._log_handler and self._logger: 410 self._logger.removeHandler(self._log_handler) 411 self._log_handler = None 412 self._logger = None 380 413 381 414 … … 398 431 self._alive = True 399 432 try: 400 self._client.run(self._host , set_up_logging=False)433 self._client.run(self._host) 401 434 finally: 402 435 self._alive = False … … 440 473 441 474 def run(self): 442 # FIXME: set_up_logging shouldn't be needed. 443 self._client.run(self._host, set_up_logging=True) 475 self.set_up_logging() 476 try: 477 self._client.run(self._host) 478 finally: 479 self.clean_up_logging() 480 481 482 class _WorkerLogHandler(logging.Handler): 483 def __init__(self, worker): 484 logging.Handler.__init__(self) 485 self._worker = worker 486 self._pid = os.getpid() 487 488 def emit(self, record): 489 self._worker._log_messages.append(record) -
trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker_unittest.py
r121509 r121807 70 70 self._worker_connection.post_message('test', 2, 'hi, ' + self._thing_to_greet) 71 71 72 def run(self, host , set_up_logging):72 def run(self, host): 73 73 if self._starting_queue: 74 74 self._starting_queue.put('') … … 103 103 return self._done 104 104 105 def handle_done(self, src ):105 def handle_done(self, src, log_messages): 106 106 self._done = True 107 107 -
trunk/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py
r121509 r121807 30 30 31 31 import logging 32 import os33 import sys34 32 import threading 35 33 import time … … 40 38 from webkitpy.layout_tests.models import test_expectations 41 39 from webkitpy.layout_tests.models import test_results 42 from webkitpy.layout_tests.views import metered_stream43 40 44 41 … … 58 55 self._tests_run_file = None 59 56 self._tests_run_filename = None 60 self._log_messages = []61 self._logger = None62 self._log_handler = None63 57 64 58 def __del__(self): … … 77 71 self._tests_run_file = self._filesystem.open_text_file_for_writing(tests_run_filename) 78 72 79 def _set_up_logging(self): 80 self._logger = logging.getLogger() 81 82 # The unix multiprocessing implementation clones the MeteredStream log handler 83 # into the child process, so we need to remove it to avoid duplicate logging. 84 for h in self._logger.handlers: 85 # log handlers don't have names until python 2.7. 86 if getattr(h, 'name', '') == metered_stream.LOG_HANDLER_NAME: 87 self._logger.removeHandler(h) 88 break 89 90 self._logger.setLevel(logging.DEBUG if self._options.verbose else logging.INFO) 91 self._log_handler = _WorkerLogHandler(self) 92 self._logger.addHandler(self._log_handler) 93 94 def run(self, host, set_up_logging): 73 def run(self, host): 95 74 if not host: 96 75 host = Host() 97 98 # FIXME: this should move into manager_worker_broker.py.99 if set_up_logging:100 self._set_up_logging()101 76 102 77 options = self._options … … 111 86 _log.debug("%s exiting" % self._name) 112 87 self.cleanup() 113 self._worker_connection.post_message('done' , self._log_messages)88 self._worker_connection.post_message('done') 114 89 115 90 def handle_test_list(self, src, list_name, test_list): … … 148 123 149 124 elapsed_time = time.time() - start 150 log_messages = self._log_messages 151 self._log_messages = [] 152 self._worker_connection.post_message('finished_test', result, elapsed_time, log_messages) 125 self._worker_connection.post_message('finished_test', result, elapsed_time) 153 126 154 127 self.clean_up_after_test(test_input, result) … … 160 133 self._tests_run_file.close() 161 134 self._tests_run_file = None 162 if self._log_handler and self._logger:163 self._logger.removeHandler(self._log_handler)164 self._log_handler = None165 self._logger = None166 135 167 136 def timeout(self, test_input): … … 280 249 return single_test_runner.run_single_test(self._port, self._options, 281 250 test_input, driver, self._name) 282 283 284 class _WorkerLogHandler(logging.Handler):285 def __init__(self, worker):286 logging.Handler.__init__(self)287 self._worker = worker288 self._pid = os.getpid()289 290 def emit(self, record):291 self._worker._log_messages.append(record)
Note: See TracChangeset
for help on using the changeset viewer.