Exemplo n.º 1
0
 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'}))
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
 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'}))