Esempio n. 1
0
def record_cross_pollination_stats(pruner_stats, pollinator_stats,
                                   project_qualified_name, sources, tag,
                                   initial_corpus_size,
                                   minimized_corpus_size_units, method):
    """Log stats about cross pollination in BigQuery."""
    # TODO(mpherman): Find a way to collect these stats for OSS Fuzz.
    if environment.is_untrusted_worker():
        return
    # BigQuery not available in local development.This is necessary because the
    # untrusted runner is in a separate process and can't be easily mocked.
    if environment.get_value('LOCAL_DEVELOPMENT') or environment.get_value(
            'PY_UNITTESTS'):
        return

    if not pruner_stats or not pollinator_stats:
        return

    bigquery_row = {
        'project_qualified_name': project_qualified_name,
        'method': method,
        'sources': sources,
        'tags': tag if tag else '',
        'initial_corpus_size': initial_corpus_size,
        'corpus_size': minimized_corpus_size_units,
        'initial_edge_coverage': pruner_stats['edge_coverage'],
        'edge_coverage': pollinator_stats['edge_coverage'],
        'initial_feature_coverage': pruner_stats['feature_coverage'],
        'feature_coverage': pollinator_stats['feature_coverage']
    }

    client = big_query.Client(dataset_id='main',
                              table_id='cross_pollination_statistics')
    client.insert([big_query.Insert(row=bigquery_row, insert_id=None)])
Esempio n. 2
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()
Esempio n. 3
0
        def wrapped(*args, **kwargs):
            if environment.is_untrusted_worker():
                return return_value

            return func(*args, **kwargs)