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)])
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 wrapped(*args, **kwargs): if environment.is_untrusted_worker(): return return_value return func(*args, **kwargs)