From d53806a4f9cab1395004bc55c1c6a387a4ad6e7e Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Fri, 18 Oct 2024 17:15:44 +0000 Subject: [PATCH 01/16] Adding job type field to build_manager.setup_build --- .../_internal/bot/tasks/utasks/analyze_task.py | 8 ++++---- .../_internal/bot/tasks/utasks/corpus_pruning_task.py | 4 +++- src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py | 4 +++- .../_internal/bot/tasks/utasks/minimize_task.py | 3 ++- .../_internal/bot/tasks/utasks/progression_task.py | 2 +- .../_internal/bot/tasks/utasks/regression_task.py | 2 +- .../_internal/bot/tasks/utasks/symbolize_task.py | 3 ++- .../_internal/bot/tasks/utasks/variant_task.py | 3 ++- .../_internal/build_management/build_manager.py | 6 +++--- 9 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py index 66adac6c15..7995a596c3 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py @@ -79,8 +79,8 @@ def handle_analyze_no_revisions_list_error(output): handle_build_setup_error(output) -def setup_build(testcase: data_types.Testcase, bad_revisions, - fuzz_target) -> Optional[uworker_msg_pb2.Output]: # pylint: disable=no-member +def setup_build(testcase: data_types.Testcase, bad_revisions, fuzz_target, + job_type) -> Optional[uworker_msg_pb2.Output]: # pylint: disable=no-member """Set up a custom or regular build based on revision. For regular builds, if a provided revision is not found, set up a build with the closest revision <= provided revision.""" @@ -101,7 +101,7 @@ def setup_build(testcase: data_types.Testcase, bad_revisions, revision = revision_list[revision_index] fuzz_target = fuzz_target.binary if fuzz_target else None - if not build_manager.setup_build(revision, fuzz_target): + if not build_manager.setup_build(revision, fuzz_target, job_type): return uworker_msg_pb2.Output( # pylint: disable=no-member error_type=uworker_msg_pb2.ErrorType.ANALYZE_BUILD_SETUP) # pylint: disable=no-member return None @@ -145,7 +145,7 @@ def setup_testcase_and_build( return None, error # Set up build. - error = setup_build(testcase, bad_revisions, fuzz_target) + error = setup_build(testcase, bad_revisions, fuzz_target, job_type) if error: return None, error diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py index 4ed00611df..69f9eb0497 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py @@ -606,7 +606,9 @@ def do_corpus_pruning(uworker_input, context, revision) -> CorpusPruningResult: return tasks_host.do_corpus_pruning(uworker_input, context, revision) if not build_manager.setup_build( - revision=revision, fuzz_target=context.fuzz_target.binary): + revision=revision, + fuzz_target=context.fuzz_target.binary, + job_type=uworker_input.job_type): raise CorpusPruningError('Failed to setup build.') build_directory = environment.get_value('BUILD_DIR') diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py index 2d55c18de0..00fa4d00fc 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py @@ -1723,7 +1723,9 @@ def run(self): fuzz_target = self.fuzz_target.binary if self.fuzz_target else None build_setup_result = build_manager.setup_build( - environment.get_value('APP_REVISION'), fuzz_target=fuzz_target) + environment.get_value('APP_REVISION'), + fuzz_target=fuzz_target, + job_type=self.job_type) engine_impl = engine.get(self.fuzzer.name) if engine_impl and build_setup_result: diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py index ffd1b0ff89..703ce5618f 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py @@ -424,7 +424,8 @@ def utask_main(uworker_input: uworker_msg_pb2.Input): # pylint: disable=no-memb crash_revision = last_tested_crash_revision or testcase.crash_revision fuzz_target = testcase_manager.get_fuzz_target_from_input(uworker_input) fuzz_target = fuzz_target.binary if fuzz_target else None - build_setup_result = build_manager.setup_build(crash_revision, fuzz_target) + build_setup_result = build_manager.setup_build(crash_revision, fuzz_target, + uworker_input.job_type) # Check if we have an application path. If not, our build failed # to setup correctly. diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py index c94c6ad6ca..9148ba268d 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py @@ -322,7 +322,7 @@ def _testcase_reproduces_in_revision( try: fuzz_target_binary = fuzz_target.binary if fuzz_target else None build_setup_result = build_manager.setup_build( - revision, fuzz_target=fuzz_target_binary) + revision, fuzz_target=fuzz_target_binary, job_type=job_type) except errors.BuildNotFoundError as e: # Build no longer exists, so we need to mark this testcase as invalid. error_message = f'Build not found at r{e.revision}' diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py index 8ba6c9abad..21eb5ba4d7 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py @@ -121,7 +121,7 @@ def _testcase_reproduces_in_revision( fuzz_target_binary = fuzz_target.binary if fuzz_target else None build_setup_result = build_manager.setup_build( - revision, fuzz_target=fuzz_target_binary) + revision, fuzz_target=fuzz_target_binary, job_type=job_type) if not build_setup_result or not build_manager.check_app_path(): error_message = f'Build setup failed r{revision}' return None, uworker_msg_pb2.Output( # pylint: disable=no-member diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py index 3007304d44..2346351f14 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py @@ -108,7 +108,8 @@ def utask_main(uworker_input): fuzz_target = testcase_manager.get_fuzz_target_from_input(uworker_input) fuzz_target = fuzz_target.binary if fuzz_target else None # Set up a custom or regular build based on revision. - build = build_manager.setup_build(build_revision, fuzz_target) + build = build_manager.setup_build(build_revision, fuzz_target, + uworker_input.job_type) # Get crash revision used in setting up build. crash_revision = environment.get_value('APP_REVISION') diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py index 17172fb0db..ce71afbc0d 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py @@ -111,7 +111,8 @@ def utask_main(uworker_input): try: fuzz_target = testcase_manager.get_fuzz_target_from_input(uworker_input) fuzz_target = fuzz_target.binary if fuzz_target else None - build_setup_result = build_manager.setup_build(fuzz_target=fuzz_target) + build_setup_result = build_manager.setup_build( + fuzz_target=fuzz_target, job_type=uworker_input.job_type) except errors.BuildNotFoundError: logs.warning('Matching build not found.') return uworker_msg_pb2.Output( # pylint: disable=no-member diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index f6fd13dc28..4dfa5e22b1 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -1309,9 +1309,9 @@ def setup_custom_binary(): return None -def setup_build(revision=0, fuzz_target=None): +def setup_build(revision=0, fuzz_target=None, job_type=None): """Set up a custom or regular build based on revision.""" - result = _setup_build(revision, fuzz_target) + result = _setup_build(revision, fuzz_target, job_type) if fuzz_target: # TODO(metzman): Remove this unjustifiable use of a mutable global # variable. @@ -1319,7 +1319,7 @@ def setup_build(revision=0, fuzz_target=None): return result -def _setup_build(revision, fuzz_target): +def _setup_build(revision, fuzz_target, job_type): # pylint: disable=unused-argument """Helper for setup_build, so setup_build can be sure to set FUZZ_TARGET on successful execution of this function.""" # For custom binaries we always use the latest version. Revision is ignored. From e33c3f4d4c08caab9c3f5ff17bcf528ca463b8ed Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Fri, 18 Oct 2024 17:40:21 +0000 Subject: [PATCH 02/16] Fix missing job_type argument in mock_setup_build for corpus_pruning --- .../tests/core/bot/tasks/utasks/corpus_pruning_task_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py index 7130b2bb19..78d89914f1 100644 --- a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py +++ b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py @@ -128,7 +128,7 @@ def tearDown(self): shutil.rmtree(self.corpus_bucket, ignore_errors=True) shutil.rmtree(self.local_gcs_buckets_path, ignore_errors=True) - def _mock_setup_build(self, revision=None, fuzz_target=None): + def _mock_setup_build(self, revision=None, fuzz_target=None, job_type=None): os.environ['BUILD_DIR'] = self.build_dir return True From 878b426a474ea943ffca89221d42ef904df3548b Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Fri, 18 Oct 2024 19:02:57 +0000 Subject: [PATCH 03/16] Passing job type to auxiliary functions that instantiate build classes --- .../build_management/build_manager.py | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index 4dfa5e22b1..fb212947c9 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -322,7 +322,8 @@ def __init__(self, base_build_dir, revision, build_prefix='', - fuzz_target=None): + fuzz_target=None, + job_type=None): super().__init__(base_build_dir) self.revision = revision self.build_prefix = build_prefix @@ -332,6 +333,7 @@ def __init__(self, # This is used by users of the class to instruct the class which fuzz # target to unpack. self.fuzz_target = fuzz_target + self.job_type = job_type def _reset_cwd(self): """Reset current working directory. Needed to clean up build @@ -668,7 +670,8 @@ def __init__(self, build_url, build_prefix='', fuzz_target=None, - http_build_url=None): + http_build_url=None, + job_type=None): """RegularBuild constructor. See Build constructor for other parameters. Args: @@ -678,7 +681,7 @@ def __init__(self, gs://foo/bar.zip. """ super().__init__( - base_build_dir, revision, build_prefix, fuzz_target=fuzz_target) + base_build_dir, revision, build_prefix, fuzz_target=fuzz_target, job_type=job_type) self.build_url = build_url self.http_build_url = http_build_url @@ -1099,7 +1102,7 @@ def _full_fuzz_target_path(bucket_path, fuzz_target): return bucket_path.replace('%TARGET%', _base_fuzz_target_name(fuzz_target)) -def _setup_split_targets_build(bucket_path, fuzz_target, revision=None): +def _setup_split_targets_build(bucket_path, fuzz_target, revision=None, job_type=None): """Set up targets build.""" bucket_path = environment.get_value('FUZZ_TARGET_BUILD_BUCKET_PATH') if not fuzz_target: @@ -1148,7 +1151,7 @@ def _get_latest_revision(bucket_paths): return None -def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None): +def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None, job_type=None): """Sets up latest trunk build.""" latest_revision = _get_latest_revision(bucket_paths) if latest_revision is None: @@ -1159,7 +1162,8 @@ def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None): latest_revision, bucket_path=bucket_paths[0], build_prefix=build_prefix, - fuzz_target=fuzz_target) + fuzz_target=fuzz_target, + job_type=job_type) if not build: logs.error('Failed to set up a build.') return None @@ -1170,7 +1174,8 @@ def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None): def setup_regular_build(revision, bucket_path=None, build_prefix='', - fuzz_target=None) -> RegularBuild: + fuzz_target=None, + job_type=None) -> RegularBuild: """Sets up build with a particular revision.""" if not bucket_path: # Bucket path can be customized, otherwise get it from the default env var. @@ -1319,7 +1324,7 @@ def setup_build(revision=0, fuzz_target=None, job_type=None): return result -def _setup_build(revision, fuzz_target, job_type): # pylint: disable=unused-argument +def _setup_build(revision, fuzz_target, job_type): """Helper for setup_build, so setup_build can be sure to set FUZZ_TARGET on successful execution of this function.""" # For custom binaries we always use the latest version. Revision is ignored. @@ -1333,11 +1338,11 @@ def _setup_build(revision, fuzz_target, job_type): # pylint: disable=unused-arg if fuzz_target_build_bucket_path: # Split fuzz target build. return _setup_split_targets_build( - fuzz_target_build_bucket_path, fuzz_target, revision=revision) + fuzz_target_build_bucket_path, fuzz_target, revision=revision, job_type=job_type) if revision: # Setup regular build with revision. - return setup_regular_build(revision, fuzz_target=fuzz_target) + return setup_regular_build(revision, fuzz_target=fuzz_target, job_type=job_type) # If no revision is provided, we default to a trunk build. bucket_paths = [] @@ -1352,7 +1357,7 @@ def _setup_build(revision, fuzz_target, job_type): # pylint: disable=unused-arg logs.error('Attempted a trunk build, but no bucket paths were found.') return None - return setup_trunk_build(bucket_paths, fuzz_target=fuzz_target) + return setup_trunk_build(bucket_paths, fuzz_target=fuzz_target, job_type=job_type) def is_custom_binary(): From 24c8eb47f87b6149a4e0247dd25edcc9ac0deaa4 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 12:44:21 +0000 Subject: [PATCH 04/16] Revert "Passing job type to auxiliary functions that instantiate build classes" This reverts commit ff71dd24500c49807840d41d3649cbf9eb53e707. --- .../build_management/build_manager.py | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index fb212947c9..4dfa5e22b1 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -322,8 +322,7 @@ def __init__(self, base_build_dir, revision, build_prefix='', - fuzz_target=None, - job_type=None): + fuzz_target=None): super().__init__(base_build_dir) self.revision = revision self.build_prefix = build_prefix @@ -333,7 +332,6 @@ def __init__(self, # This is used by users of the class to instruct the class which fuzz # target to unpack. self.fuzz_target = fuzz_target - self.job_type = job_type def _reset_cwd(self): """Reset current working directory. Needed to clean up build @@ -670,8 +668,7 @@ def __init__(self, build_url, build_prefix='', fuzz_target=None, - http_build_url=None, - job_type=None): + http_build_url=None): """RegularBuild constructor. See Build constructor for other parameters. Args: @@ -681,7 +678,7 @@ def __init__(self, gs://foo/bar.zip. """ super().__init__( - base_build_dir, revision, build_prefix, fuzz_target=fuzz_target, job_type=job_type) + base_build_dir, revision, build_prefix, fuzz_target=fuzz_target) self.build_url = build_url self.http_build_url = http_build_url @@ -1102,7 +1099,7 @@ def _full_fuzz_target_path(bucket_path, fuzz_target): return bucket_path.replace('%TARGET%', _base_fuzz_target_name(fuzz_target)) -def _setup_split_targets_build(bucket_path, fuzz_target, revision=None, job_type=None): +def _setup_split_targets_build(bucket_path, fuzz_target, revision=None): """Set up targets build.""" bucket_path = environment.get_value('FUZZ_TARGET_BUILD_BUCKET_PATH') if not fuzz_target: @@ -1151,7 +1148,7 @@ def _get_latest_revision(bucket_paths): return None -def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None, job_type=None): +def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None): """Sets up latest trunk build.""" latest_revision = _get_latest_revision(bucket_paths) if latest_revision is None: @@ -1162,8 +1159,7 @@ def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None, job_type=Non latest_revision, bucket_path=bucket_paths[0], build_prefix=build_prefix, - fuzz_target=fuzz_target, - job_type=job_type) + fuzz_target=fuzz_target) if not build: logs.error('Failed to set up a build.') return None @@ -1174,8 +1170,7 @@ def setup_trunk_build(bucket_paths, fuzz_target, build_prefix=None, job_type=Non def setup_regular_build(revision, bucket_path=None, build_prefix='', - fuzz_target=None, - job_type=None) -> RegularBuild: + fuzz_target=None) -> RegularBuild: """Sets up build with a particular revision.""" if not bucket_path: # Bucket path can be customized, otherwise get it from the default env var. @@ -1324,7 +1319,7 @@ def setup_build(revision=0, fuzz_target=None, job_type=None): return result -def _setup_build(revision, fuzz_target, job_type): +def _setup_build(revision, fuzz_target, job_type): # pylint: disable=unused-argument """Helper for setup_build, so setup_build can be sure to set FUZZ_TARGET on successful execution of this function.""" # For custom binaries we always use the latest version. Revision is ignored. @@ -1338,11 +1333,11 @@ def _setup_build(revision, fuzz_target, job_type): if fuzz_target_build_bucket_path: # Split fuzz target build. return _setup_split_targets_build( - fuzz_target_build_bucket_path, fuzz_target, revision=revision, job_type=job_type) + fuzz_target_build_bucket_path, fuzz_target, revision=revision) if revision: # Setup regular build with revision. - return setup_regular_build(revision, fuzz_target=fuzz_target, job_type=job_type) + return setup_regular_build(revision, fuzz_target=fuzz_target) # If no revision is provided, we default to a trunk build. bucket_paths = [] @@ -1357,7 +1352,7 @@ def _setup_build(revision, fuzz_target, job_type): logs.error('Attempted a trunk build, but no bucket paths were found.') return None - return setup_trunk_build(bucket_paths, fuzz_target=fuzz_target, job_type=job_type) + return setup_trunk_build(bucket_paths, fuzz_target=fuzz_target) def is_custom_binary(): From 96b52a6fd9f8a043ead7423b13ba8196fbc7c50f Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 12:44:36 +0000 Subject: [PATCH 05/16] Revert "Fix missing job_type argument in mock_setup_build for corpus_pruning" This reverts commit 00b83b5fec37742b8e9abfc7d3cc637289481e28. --- .../tests/core/bot/tasks/utasks/corpus_pruning_task_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py index 78d89914f1..7130b2bb19 100644 --- a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py +++ b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py @@ -128,7 +128,7 @@ def tearDown(self): shutil.rmtree(self.corpus_bucket, ignore_errors=True) shutil.rmtree(self.local_gcs_buckets_path, ignore_errors=True) - def _mock_setup_build(self, revision=None, fuzz_target=None, job_type=None): + def _mock_setup_build(self, revision=None, fuzz_target=None): os.environ['BUILD_DIR'] = self.build_dir return True From 51c6f57fdc3cb566b2cdfc3cb62dbd7f037f959e Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 12:44:52 +0000 Subject: [PATCH 06/16] Revert "Adding job type field to build_manager.setup_build" This reverts commit d9ea365c969ad23fdf54bddfebb9e20f0a89c4dd. --- .../_internal/bot/tasks/utasks/analyze_task.py | 8 ++++---- .../_internal/bot/tasks/utasks/corpus_pruning_task.py | 4 +--- src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py | 4 +--- .../_internal/bot/tasks/utasks/minimize_task.py | 3 +-- .../_internal/bot/tasks/utasks/progression_task.py | 2 +- .../_internal/bot/tasks/utasks/regression_task.py | 2 +- .../_internal/bot/tasks/utasks/symbolize_task.py | 3 +-- .../_internal/bot/tasks/utasks/variant_task.py | 3 +-- .../_internal/build_management/build_manager.py | 6 +++--- 9 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py index 7995a596c3..66adac6c15 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/analyze_task.py @@ -79,8 +79,8 @@ def handle_analyze_no_revisions_list_error(output): handle_build_setup_error(output) -def setup_build(testcase: data_types.Testcase, bad_revisions, fuzz_target, - job_type) -> Optional[uworker_msg_pb2.Output]: # pylint: disable=no-member +def setup_build(testcase: data_types.Testcase, bad_revisions, + fuzz_target) -> Optional[uworker_msg_pb2.Output]: # pylint: disable=no-member """Set up a custom or regular build based on revision. For regular builds, if a provided revision is not found, set up a build with the closest revision <= provided revision.""" @@ -101,7 +101,7 @@ def setup_build(testcase: data_types.Testcase, bad_revisions, fuzz_target, revision = revision_list[revision_index] fuzz_target = fuzz_target.binary if fuzz_target else None - if not build_manager.setup_build(revision, fuzz_target, job_type): + if not build_manager.setup_build(revision, fuzz_target): return uworker_msg_pb2.Output( # pylint: disable=no-member error_type=uworker_msg_pb2.ErrorType.ANALYZE_BUILD_SETUP) # pylint: disable=no-member return None @@ -145,7 +145,7 @@ def setup_testcase_and_build( return None, error # Set up build. - error = setup_build(testcase, bad_revisions, fuzz_target, job_type) + error = setup_build(testcase, bad_revisions, fuzz_target) if error: return None, error diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py index 69f9eb0497..4ed00611df 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py @@ -606,9 +606,7 @@ def do_corpus_pruning(uworker_input, context, revision) -> CorpusPruningResult: return tasks_host.do_corpus_pruning(uworker_input, context, revision) if not build_manager.setup_build( - revision=revision, - fuzz_target=context.fuzz_target.binary, - job_type=uworker_input.job_type): + revision=revision, fuzz_target=context.fuzz_target.binary): raise CorpusPruningError('Failed to setup build.') build_directory = environment.get_value('BUILD_DIR') diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py index 00fa4d00fc..2d55c18de0 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py @@ -1723,9 +1723,7 @@ def run(self): fuzz_target = self.fuzz_target.binary if self.fuzz_target else None build_setup_result = build_manager.setup_build( - environment.get_value('APP_REVISION'), - fuzz_target=fuzz_target, - job_type=self.job_type) + environment.get_value('APP_REVISION'), fuzz_target=fuzz_target) engine_impl = engine.get(self.fuzzer.name) if engine_impl and build_setup_result: diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py index 703ce5618f..ffd1b0ff89 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/minimize_task.py @@ -424,8 +424,7 @@ def utask_main(uworker_input: uworker_msg_pb2.Input): # pylint: disable=no-memb crash_revision = last_tested_crash_revision or testcase.crash_revision fuzz_target = testcase_manager.get_fuzz_target_from_input(uworker_input) fuzz_target = fuzz_target.binary if fuzz_target else None - build_setup_result = build_manager.setup_build(crash_revision, fuzz_target, - uworker_input.job_type) + build_setup_result = build_manager.setup_build(crash_revision, fuzz_target) # Check if we have an application path. If not, our build failed # to setup correctly. diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py index 9148ba268d..c94c6ad6ca 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/progression_task.py @@ -322,7 +322,7 @@ def _testcase_reproduces_in_revision( try: fuzz_target_binary = fuzz_target.binary if fuzz_target else None build_setup_result = build_manager.setup_build( - revision, fuzz_target=fuzz_target_binary, job_type=job_type) + revision, fuzz_target=fuzz_target_binary) except errors.BuildNotFoundError as e: # Build no longer exists, so we need to mark this testcase as invalid. error_message = f'Build not found at r{e.revision}' diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py index 21eb5ba4d7..8ba6c9abad 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/regression_task.py @@ -121,7 +121,7 @@ def _testcase_reproduces_in_revision( fuzz_target_binary = fuzz_target.binary if fuzz_target else None build_setup_result = build_manager.setup_build( - revision, fuzz_target=fuzz_target_binary, job_type=job_type) + revision, fuzz_target=fuzz_target_binary) if not build_setup_result or not build_manager.check_app_path(): error_message = f'Build setup failed r{revision}' return None, uworker_msg_pb2.Output( # pylint: disable=no-member diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py index 2346351f14..3007304d44 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/symbolize_task.py @@ -108,8 +108,7 @@ def utask_main(uworker_input): fuzz_target = testcase_manager.get_fuzz_target_from_input(uworker_input) fuzz_target = fuzz_target.binary if fuzz_target else None # Set up a custom or regular build based on revision. - build = build_manager.setup_build(build_revision, fuzz_target, - uworker_input.job_type) + build = build_manager.setup_build(build_revision, fuzz_target) # Get crash revision used in setting up build. crash_revision = environment.get_value('APP_REVISION') diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py b/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py index ce71afbc0d..17172fb0db 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/variant_task.py @@ -111,8 +111,7 @@ def utask_main(uworker_input): try: fuzz_target = testcase_manager.get_fuzz_target_from_input(uworker_input) fuzz_target = fuzz_target.binary if fuzz_target else None - build_setup_result = build_manager.setup_build( - fuzz_target=fuzz_target, job_type=uworker_input.job_type) + build_setup_result = build_manager.setup_build(fuzz_target=fuzz_target) except errors.BuildNotFoundError: logs.warning('Matching build not found.') return uworker_msg_pb2.Output( # pylint: disable=no-member diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index 4dfa5e22b1..f6fd13dc28 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -1309,9 +1309,9 @@ def setup_custom_binary(): return None -def setup_build(revision=0, fuzz_target=None, job_type=None): +def setup_build(revision=0, fuzz_target=None): """Set up a custom or regular build based on revision.""" - result = _setup_build(revision, fuzz_target, job_type) + result = _setup_build(revision, fuzz_target) if fuzz_target: # TODO(metzman): Remove this unjustifiable use of a mutable global # variable. @@ -1319,7 +1319,7 @@ def setup_build(revision=0, fuzz_target=None, job_type=None): return result -def _setup_build(revision, fuzz_target, job_type): # pylint: disable=unused-argument +def _setup_build(revision, fuzz_target): """Helper for setup_build, so setup_build can be sure to set FUZZ_TARGET on successful execution of this function.""" # For custom binaries we always use the latest version. Revision is ignored. From 108090d3da9398182eee177098d9c15a04168be8 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 13:04:15 +0000 Subject: [PATCH 07/16] Adding build retrieval time metric definition --- .../_internal/metrics/monitoring_metrics.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py index ef70f3b44a..39595f943b 100644 --- a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py +++ b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py @@ -32,6 +32,17 @@ monitor.BooleanField('bad_build'), ]) +JOB_BUILD_RETRIEVAL_TIME = monitor.CumulativeDistributionMetric( + 'task/fuzz/job/build_retrieval_time', + bucketer=monitor.FixedWidthBucketer(width=0.05, num_finite_buckets=20), + description=('Distribution of fuzz task\'s build retrieval times. ' + '(grouped by fuzzer/job)'), + field_spec=[ + monitor.StringField('fuzzer'), + monitor.StringField('job_type') + ], +) + FUZZER_KNOWN_CRASH_COUNT = monitor.CounterMetric( 'task/fuzz/fuzzer/known_crash_count', description=('Count of fuzz task\'s known crash count ' From 19b6f1e07b48778861b29b2495615ff8df32b72a Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 15:05:20 +0000 Subject: [PATCH 08/16] Fix lint --- src/clusterfuzz/_internal/metrics/monitoring_metrics.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py index 39595f943b..a98056a8bf 100644 --- a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py +++ b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py @@ -39,7 +39,8 @@ '(grouped by fuzzer/job)'), field_spec=[ monitor.StringField('fuzzer'), - monitor.StringField('job_type') + monitor.StringField('job_type'), + monitor.StringField('step'), ], ) From eb8ae0c0420fc05cddc75e2844b99b3a3bcd1777 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 15:16:00 +0000 Subject: [PATCH 09/16] Adding build download time metric --- .../_internal/build_management/build_manager.py | 12 ++++++++++++ .../_internal/metrics/monitoring_metrics.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index f6fd13dc28..78a2051dc2 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -34,6 +34,7 @@ from clusterfuzz._internal.google_cloud_utils import blobs from clusterfuzz._internal.google_cloud_utils import storage from clusterfuzz._internal.metrics import logs +from clusterfuzz._internal.metrics import monitoring_metrics from clusterfuzz._internal.platforms import android from clusterfuzz._internal.system import archive from clusterfuzz._internal.system import environment @@ -417,6 +418,7 @@ def _download_and_open_build_archive(self, base_build_dir: str, Yields: the build archive """ + start_time = time.time() # Download build archive locally. build_local_archive = os.path.join(build_dir, os.path.basename(build_url)) @@ -432,6 +434,15 @@ def _download_and_open_build_archive(self, base_build_dir: str, logs.info(f'Downloading build from {build_url} to {build_local_archive}.') try: storage.copy_file_from(build_url, build_local_archive) + build_download_duration = time.time() - start_time + monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( + build_download_duration, { + 'fuzz_target': self.fuzz_target, + 'job_type': os.getenv('JOB_TYPE'), + 'platform': environment.platform(), + 'step': 'download', + } + ) except Exception as e: logs.error(f'Unable to download build from {build_url}: {e}') raise @@ -475,6 +486,7 @@ def _open_build_archive(self, base_build_dir: str, build_dir: str, if not can_unzip_over_http: return self._download_and_open_build_archive(base_build_dir, build_dir, build_url) + # We do not emmit a metric for build download time, if using http logs.info("Opening an archive over HTTP, skipping archive download.") assert http_build_url return build_archive.open_uri(http_build_url) diff --git a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py index a98056a8bf..f4fd776f9b 100644 --- a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py +++ b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py @@ -38,7 +38,7 @@ description=('Distribution of fuzz task\'s build retrieval times. ' '(grouped by fuzzer/job)'), field_spec=[ - monitor.StringField('fuzzer'), + monitor.StringField('fuzz_target'), monitor.StringField('job_type'), monitor.StringField('step'), ], From 5fc6dc5a2d4b3e5ce219aced579fd087e2a2e761 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 15:38:05 +0000 Subject: [PATCH 10/16] Add remaining metrics --- .../build_management/build_manager.py | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index 78a2051dc2..e3e58cfeb9 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -418,7 +418,6 @@ def _download_and_open_build_archive(self, base_build_dir: str, Yields: the build archive """ - start_time = time.time() # Download build archive locally. build_local_archive = os.path.join(build_dir, os.path.basename(build_url)) @@ -433,6 +432,7 @@ def _download_and_open_build_archive(self, base_build_dir: str, logs.info(f'Downloading build from {build_url} to {build_local_archive}.') try: + start_time = time.time() storage.copy_file_from(build_url, build_local_archive) build_download_duration = time.time() - start_time monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( @@ -562,6 +562,16 @@ def _unpack_build(self, utils.write_data_to_file('', partial_build_file_path) elapsed_time = time.time() - start_time + monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( + elapsed_time, { + # The concept of a fuzz target does not apply + # to blackbox fuzzers + 'fuzz_target': self.fuzz_target, + 'job_type': os.getenv('JOB_TYPE'), + 'platform': environment.platform(), + 'step': 'unpack', + }) + elapsed_mins = elapsed_time / 60. log_func = logs.warning if elapsed_time > UNPACK_TIME_LIMIT else logs.info log_func(f'Build took {elapsed_mins:0.02f} minutes to unpack.') @@ -874,6 +884,9 @@ def _unpack_custom_build(self): self.custom_binary_filename) custom_builds_bucket = local_config.ProjectConfig().get( 'custom_builds.bucket') + + download_start_time = time.time() + if custom_builds_bucket: directory = os.path.dirname(build_local_archive) if not os.path.exists(directory): @@ -883,6 +896,17 @@ def _unpack_custom_build(self): elif not blobs.read_blob_to_disk(self.custom_binary_key, build_local_archive): return False + + build_download_time = time.time() - download_start_time + monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( + build_download_time, { + # The concept of a fuzz target does not apply + # to blackbox fuzzers + 'fuzz_target': 'N/A', + 'job_type': os.getenv('JOB_TYPE'), + 'platform': environment.platform(), + 'step': 'download', + }) # If custom binary is an archive, then unpack it. if archive.is_archive(self.custom_binary_filename): @@ -900,7 +924,19 @@ def _unpack_custom_build(self): logs.log_fatal_and_exit('Could not make space for build.') try: + # Unpack belongs to the BuildArchive class + unpack_start_time = time.time() build.unpack(self.build_dir, trusted=True) + build_unpack_time = time.time() - unpack_start_time + monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( + build_unpack_time, { + # The concept of a fuzz target does not apply + # to blackbox fuzzers + 'fuzz_target': 'N/A', + 'job_type': os.getenv('JOB_TYPE'), + 'platform': environment.platform(), + 'step': 'unpack', + }) except: build.close() logs.error('Unable to unpack build archive %s.' % build_local_archive) From 436b853371a02e74cfaa66e356143c41e6cfafe7 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 15:47:13 +0000 Subject: [PATCH 11/16] Fix lint --- .../build_management/build_manager.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index e3e58cfeb9..4320b199db 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -436,13 +436,12 @@ def _download_and_open_build_archive(self, base_build_dir: str, storage.copy_file_from(build_url, build_local_archive) build_download_duration = time.time() - start_time monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( - build_download_duration, { - 'fuzz_target': self.fuzz_target, - 'job_type': os.getenv('JOB_TYPE'), - 'platform': environment.platform(), - 'step': 'download', - } - ) + build_download_duration, { + 'fuzz_target': self.fuzz_target, + 'job_type': os.getenv('JOB_TYPE'), + 'platform': environment.platform(), + 'step': 'download', + }) except Exception as e: logs.error(f'Unable to download build from {build_url}: {e}') raise @@ -563,7 +562,8 @@ def _unpack_build(self, elapsed_time = time.time() - start_time monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( - elapsed_time, { + elapsed_time, + { # The concept of a fuzz target does not apply # to blackbox fuzzers 'fuzz_target': self.fuzz_target, @@ -896,10 +896,11 @@ def _unpack_custom_build(self): elif not blobs.read_blob_to_disk(self.custom_binary_key, build_local_archive): return False - + build_download_time = time.time() - download_start_time monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( - build_download_time, { + build_download_time, + { # The concept of a fuzz target does not apply # to blackbox fuzzers 'fuzz_target': 'N/A', @@ -929,7 +930,8 @@ def _unpack_custom_build(self): build.unpack(self.build_dir, trusted=True) build_unpack_time = time.time() - unpack_start_time monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( - build_unpack_time, { + build_unpack_time, + { # The concept of a fuzz target does not apply # to blackbox fuzzers 'fuzz_target': 'N/A', From ce3e36473402bd89f354e8f85d2479545093b762 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 15:53:46 +0000 Subject: [PATCH 12/16] Add time mock so unit tests pass --- .../_internal/tests/core/build_management/build_manager_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/clusterfuzz/_internal/tests/core/build_management/build_manager_test.py b/src/clusterfuzz/_internal/tests/core/build_management/build_manager_test.py index c8f273cc24..a35937a1d1 100644 --- a/src/clusterfuzz/_internal/tests/core/build_management/build_manager_test.py +++ b/src/clusterfuzz/_internal/tests/core/build_management/build_manager_test.py @@ -1178,6 +1178,7 @@ def test_setup_shared(self): def test_delete(self): """Test deleting this build.""" os.environ['JOB_NAME'] = 'job_custom' + self.mock.time.return_value = 1000.0 build = build_manager.setup_custom_binary() self.assertTrue(os.path.isdir('/builds/job_custom/custom')) build.delete() From 2ba39ba5c18ac0160f9775364f43e91b20f69972 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Mon, 21 Oct 2024 15:59:02 +0000 Subject: [PATCH 13/16] Adding platform to build retrieval metric definition --- src/clusterfuzz/_internal/metrics/monitoring_metrics.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py index f4fd776f9b..7e6f7568ac 100644 --- a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py +++ b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py @@ -41,6 +41,7 @@ monitor.StringField('fuzz_target'), monitor.StringField('job_type'), monitor.StringField('step'), + monitor.StringField('platform'), ], ) From d0561abcc4a7707ae10b3cc4cf48231ce7f8b487 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Tue, 22 Oct 2024 18:13:02 +0000 Subject: [PATCH 14/16] Using job label to conform to the previous standard --- .../_internal/build_management/build_manager.py | 8 ++++---- src/clusterfuzz/_internal/metrics/monitoring_metrics.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index 4320b199db..636f254b57 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -438,7 +438,7 @@ def _download_and_open_build_archive(self, base_build_dir: str, monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( build_download_duration, { 'fuzz_target': self.fuzz_target, - 'job_type': os.getenv('JOB_TYPE'), + 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(), 'step': 'download', }) @@ -567,7 +567,7 @@ def _unpack_build(self, # The concept of a fuzz target does not apply # to blackbox fuzzers 'fuzz_target': self.fuzz_target, - 'job_type': os.getenv('JOB_TYPE'), + 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(), 'step': 'unpack', }) @@ -904,7 +904,7 @@ def _unpack_custom_build(self): # The concept of a fuzz target does not apply # to blackbox fuzzers 'fuzz_target': 'N/A', - 'job_type': os.getenv('JOB_TYPE'), + 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(), 'step': 'download', }) @@ -935,7 +935,7 @@ def _unpack_custom_build(self): # The concept of a fuzz target does not apply # to blackbox fuzzers 'fuzz_target': 'N/A', - 'job_type': os.getenv('JOB_TYPE'), + 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(), 'step': 'unpack', }) diff --git a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py index 7e6f7568ac..fbb19dc132 100644 --- a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py +++ b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py @@ -39,7 +39,7 @@ '(grouped by fuzzer/job)'), field_spec=[ monitor.StringField('fuzz_target'), - monitor.StringField('job_type'), + monitor.StringField('job'), monitor.StringField('step'), monitor.StringField('platform'), ], From abf4d279620762a88fb2ece27b3e915eff01670e Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Tue, 22 Oct 2024 18:14:47 +0000 Subject: [PATCH 15/16] Improving fuzz target comments --- src/clusterfuzz/_internal/build_management/build_manager.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index 636f254b57..a760cc087e 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -564,8 +564,6 @@ def _unpack_build(self, monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( elapsed_time, { - # The concept of a fuzz target does not apply - # to blackbox fuzzers 'fuzz_target': self.fuzz_target, 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(), @@ -901,8 +899,7 @@ def _unpack_custom_build(self): monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( build_download_time, { - # The concept of a fuzz target does not apply - # to blackbox fuzzers + # Custom builds don't support fuzz targets. 'fuzz_target': 'N/A', 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(), From 54fc38794d53297babd678d4d6e2af1470cd4ba0 Mon Sep 17 00:00:00 2001 From: Vitor Guidi Date: Tue, 22 Oct 2024 18:24:55 +0000 Subject: [PATCH 16/16] Fix lint --- src/clusterfuzz/_internal/build_management/build_manager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/clusterfuzz/_internal/build_management/build_manager.py b/src/clusterfuzz/_internal/build_management/build_manager.py index a760cc087e..5cb6867b87 100644 --- a/src/clusterfuzz/_internal/build_management/build_manager.py +++ b/src/clusterfuzz/_internal/build_management/build_manager.py @@ -562,8 +562,7 @@ def _unpack_build(self, elapsed_time = time.time() - start_time monitoring_metrics.JOB_BUILD_RETRIEVAL_TIME.add( - elapsed_time, - { + elapsed_time, { 'fuzz_target': self.fuzz_target, 'job': os.getenv('JOB_TYPE'), 'platform': environment.platform(),