def test_has_revision(self): """Test when there's a revision.""" os.mkdir('/root') self.fs.CreateFile(os.path.join('/root', utils.LOCAL_SOURCE_MANIFEST), contents='revision') update_task.track_revision() self.assertEqual( 1, monitoring_metrics.BOT_COUNT.get({'revision': 'revision'}))
def task_loop(): """Executes tasks indefinitely.""" # Defer heavy task imports to prevent issues with multiprocessing.Process from bot.tasks import commands clean_exit = False while True: stacktrace = '' exception_occurred = False task = None # This caches the current environment on first run. Don't move this. environment.reset_environment() try: # Run regular updates. update_task.run() update_task.track_revision() task = tasks.get_task() if not task: continue with _Monitor(task): with task.lease(): # Execute the command and delete the task. commands.process_command(task) except SystemExit as e: exception_occurred = True clean_exit = (e.code == 0) if not clean_exit and not isinstance(e, untrusted.HostException): logs.log_error('SystemExit occurred while working on task.') stacktrace = traceback.format_exc() except commands.AlreadyRunningError: exception_occurred = False except Exception: logs.log_error('Error occurred while working on task.') exception_occurred = True stacktrace = traceback.format_exc() if exception_occurred: # Prevent looping too quickly. See: crbug.com/644830 failure_wait_interval = environment.get_value('FAIL_WAIT') time.sleep(utils.random_number(1, failure_wait_interval)) break task_payload = task.payload() if task else None return stacktrace, clean_exit, task_payload
def main(): """Prepare the configuration options and start requesting tasks.""" logs.configure('run_bot') root_directory = environment.get_value('ROOT_DIR') if not root_directory: print('Please set ROOT_DIR environment variable to the root of the source ' 'checkout before running. Exiting.') print('For an example, check init.bash in the local directory.') return dates.initialize_timezone_from_environment() environment.set_bot_environment() monitor.initialize() if not profiler.start_if_needed('python_profiler_bot'): sys.exit(-1) if environment.is_trusted_host(ensure_connected=False): from bot.untrusted_runner import host host.init() if environment.is_untrusted_worker(): # Track revision since we won't go into the task_loop. update_task.track_revision() from bot.untrusted_runner import untrusted as untrusted_worker untrusted_worker.start_server() assert False, 'Unreachable code' while True: # task_loop should be an infinite loop, # unless we run into an exception. error_stacktrace, clean_exit, task_payload = task_loop() # Print the error trace to the console. if not clean_exit: print('Exception occurred while running "%s".' % task_payload) print('-' * 80) print(error_stacktrace) print('-' * 80) should_terminate = ( clean_exit or errors.error_in_list(error_stacktrace, errors.BOT_ERROR_TERMINATION_LIST)) if should_terminate: return logs.log_error( 'Task exited with exception.', error_stacktrace=error_stacktrace, task_payload=task_payload) should_hang = errors.error_in_list(error_stacktrace, errors.BOT_ERROR_HANG_LIST) if should_hang: logs.log('Start hanging forever.') while True: # Sleep to avoid consuming 100% of CPU. time.sleep(60) # See if our run timed out, if yes bail out. if data_handler.bot_run_timed_out(): return # Clear the current exception. sys.exc_clear()
def test_no_revision(self): """Test when there's no revision.""" update_task.track_revision() self.assertEqual( 0, monitoring_metrics.BOT_COUNT.get({'revision': 'revision'}))