diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/__init__.py b/src/clusterfuzz/_internal/bot/tasks/utasks/__init__.py index ff822258f2..3660e7c01f 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/__init__.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/__init__.py @@ -109,6 +109,8 @@ def __init__(self, subtask: _Subtask): else: self._preprocess_start_time_ns = None + self._previous_subtask_end_time_ns = None + # Events-related metadata. self._event_data = None # Error type from utask main handled in postprocess. @@ -123,7 +125,8 @@ def set_task_details( execution_mode: Mode, platform: str, preprocess_start_time: Optional[Timestamp] = None, - task_argument: Optional[str | uworker_msg_pb2.Input] = None): # pylint: disable=no-member + task_argument: Optional[str | uworker_msg_pb2.Input] = None, # pylint: disable=no-member + previous_subtask_end_time: Optional[Timestamp] = None): """Sets task details that might not be known at instantation time. Must be called once for metrics to be recorded when exiting the context. @@ -141,6 +144,8 @@ def set_task_details( task_argument: Task argument, which for preprocess is usually the `testcase_id` or `fuzzer_name`, and for main/postprocess is the uworker input proto. + previous_subtask_end_time: Timestamp at which the previous subtask for + this task finished executing. None if there is no previous subtask. """ task_command = task_utils.get_command_from_module(utask_module.__name__) self._labels = { @@ -161,6 +166,11 @@ def set_task_details( # Ensure we always have a value after this method returns. assert self._preprocess_start_time_ns is not None + if previous_subtask_end_time is not None: + end_time = previous_subtask_end_time.ToNanoseconds() + if end_time > 0: + self._previous_subtask_end_time_ns = end_time + def emit_utask_events(self, task_status: str, task_outcome: str | None = None) -> None: """Helper to emit task execution events during the recorder context.""" @@ -237,6 +247,12 @@ def __exit__(self, _exc_type, _exc_value, _traceback): monitoring_metrics.UTASK_SUBTASK_E2E_DURATION_SECS.add( e2e_duration_secs, self._labels) + if self._previous_subtask_end_time_ns is not None: + wait_duration_secs = max( + 0, (self.start_time_ns - self._previous_subtask_end_time_ns) / 10**9) + monitoring_metrics.UTASK_SUBTASK_WAIT_DURATION_SECS.add( + wait_duration_secs, self._labels) + # The only case where a task might fail without throwing, is in # utask_main, by returning an ErrorType proto which indicates # failure. @@ -340,6 +356,7 @@ def tworker_preprocess_no_io(utask_module, task_argument, job_type, if not uworker_input: return None + uworker_input.preprocess_end_time.FromNanoseconds(time.time_ns()) return uworker_io.serialize_uworker_input(uworker_input) @@ -356,9 +373,13 @@ def uworker_main_no_io(utask_module, serialized_uworker_input): uworker_input.uworker_env.clear() task_utils.reset_task_stage_env() - recorder.set_task_details(utask_module, uworker_input.job_type, Mode.QUEUE, - environment.platform(), - uworker_input.preprocess_start_time) + recorder.set_task_details( + utask_module, + uworker_input.job_type, + Mode.QUEUE, + environment.platform(), + uworker_input.preprocess_start_time, + previous_subtask_end_time=uworker_input.preprocess_end_time) uworker_output = utask_module.utask_main(uworker_input) if uworker_output is None: @@ -428,7 +449,9 @@ def tworker_preprocess(utask_module, task_argument, job_type, uworker_env): # to pass to the batch job and for the local executor to download locally, # and the uworker output download URL for the local executor to download # the output after local execution of `utask_main`. - return uworker_io.serialize_and_upload_uworker_input(uworker_input) + urls = uworker_io.prepare_uworker_io_urls() + uworker_input.preprocess_end_time.FromNanoseconds(time.time_ns()) + return uworker_io.serialize_and_upload_uworker_input(uworker_input, urls) def set_uworker_env(uworker_env: dict) -> None: @@ -463,8 +486,12 @@ def uworker_main(input_download_url) -> None: execution_mode = Mode.SWARMING if environment.is_running_on_swarming( ) else Mode.BATCH recorder.set_task_details( - utask_module, uworker_input.job_type, execution_mode, - environment.platform(), uworker_input.preprocess_start_time) + utask_module, + uworker_input.job_type, + execution_mode, + environment.platform(), + uworker_input.preprocess_start_time, + previous_subtask_end_time=uworker_input.preprocess_end_time) logs.info('Starting utask_main: %s.' % utask_module) uworker_output = utask_module.utask_main(uworker_input) diff --git a/src/clusterfuzz/_internal/bot/tasks/utasks/uworker_io.py b/src/clusterfuzz/_internal/bot/tasks/utasks/uworker_io.py index 4ec121b8cd..5fdc2949e8 100644 --- a/src/clusterfuzz/_internal/bot/tasks/utasks/uworker_io.py +++ b/src/clusterfuzz/_internal/bot/tasks/utasks/uworker_io.py @@ -13,7 +13,6 @@ # limitations under the License. """Module for dealing with input and output (I/O) to a uworker.""" -from typing import Tuple from typing import Type from typing import TypeVar import uuid @@ -99,9 +98,8 @@ def serialize_uworker_input(uworker_input: uworker_msg_pb2.Input) -> bytes: # p return uworker_input.SerializeToString() -def serialize_and_upload_uworker_input( - uworker_input: uworker_msg_pb2.Input) -> Tuple[str, str]: # pylint: disable=no-member - """Serializes input for the untrusted portion of a task.""" +def prepare_uworker_io_urls() -> tuple[str, str, str, str]: + """Generates URLs for GCS upload/download.""" signed_input_download_url, input_gcs_url = get_uworker_input_urls() logs.info(f'input_gcs_url: {input_gcs_url}') # Get URLs for the uworker'ps output. We need a signed upload URL so it can @@ -111,12 +109,22 @@ def serialize_and_upload_uworker_input( input_gcs_url) logs.info(f'output_gcs_url: {output_gcs_url}') + return (signed_input_download_url, signed_output_upload_url, input_gcs_url, + output_gcs_url) + + +def serialize_and_upload_uworker_input( + uworker_input: uworker_msg_pb2.Input, # pylint: disable=no-member + urls: tuple[str, str, str, str]) -> tuple[str, str]: + """Serializes input for the untrusted portion of a task.""" + (signed_input_download_url, signed_output_upload_url, input_gcs_url, + output_gcs_url) = urls + assert not uworker_input.HasField('uworker_output_upload_url') uworker_input.uworker_output_upload_url = signed_output_upload_url serialized_uworker_input = zlib.compress(uworker_input.SerializeToString()) upload_uworker_input(serialized_uworker_input, input_gcs_url) - return signed_input_download_url, output_gcs_url diff --git a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py index ba935f4680..2823006160 100644 --- a/src/clusterfuzz/_internal/metrics/monitoring_metrics.py +++ b/src/clusterfuzz/_internal/metrics/monitoring_metrics.py @@ -374,6 +374,22 @@ ], ) +UTASK_SUBTASK_WAIT_DURATION_SECS = monitor.CumulativeDistributionMetric( + 'utask/subtask_wait_duration_secs', + description=( + 'Time elapsed between the previous subtask finishing and the current ' + 'subtask starting, in seconds, per subtask. ' + 'Mode is "batch", "swarming", or "queue".'), + bucketer=monitor.GeometricBucketer(), + field_spec=[ + monitor.StringField('task'), + monitor.StringField('job'), + monitor.StringField('subtask'), + monitor.StringField('mode'), + monitor.StringField('platform'), + ], +) + ANDROID_UPTIME = monitor.CounterMetric( 'android_device_uptime', description='Android device uptime', diff --git a/src/clusterfuzz/_internal/protos/uworker_msg.proto b/src/clusterfuzz/_internal/protos/uworker_msg.proto index 8e00651c4d..2380f681aa 100644 --- a/src/clusterfuzz/_internal/protos/uworker_msg.proto +++ b/src/clusterfuzz/_internal/protos/uworker_msg.proto @@ -145,6 +145,7 @@ message Input { optional google.protobuf.Timestamp preprocess_start_time = 19; repeated string global_blacklisted_functions = 20; optional google.protobuf.Any fuzz_target = 21; + optional google.protobuf.Timestamp preprocess_end_time = 22; } message VariantTaskInput { diff --git a/src/clusterfuzz/_internal/protos/uworker_msg_pb2.py b/src/clusterfuzz/_internal/protos/uworker_msg_pb2.py index ab6320406c..f142bbef90 100644 --- a/src/clusterfuzz/_internal/protos/uworker_msg_pb2.py +++ b/src/clusterfuzz/_internal/protos/uworker_msg_pb2.py @@ -31,7 +31,7 @@ from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.clusterfuzz/_internal/protos/uworker_msg.proto\x12\x0buworker_msg\x1a\x19google/protobuf/any.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\"\x85\x03\n\nSetupInput\x12)\n\x06\x66uzzer\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\x18\n\x0b\x66uzzer_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\"\n\x15\x66uzzer_log_upload_url\x18\x04 \x01(\tH\x02\x88\x01\x01\x12 \n\x13\x66uzzer_download_url\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\"\n\x15testcase_download_url\x18\x06 \x01(\tH\x04\x88\x01\x01\x12$\n\x1cglobal_blacklisted_functions\x18\x07 \x03(\t\x12;\n\x14\x64\x61ta_bundle_corpuses\x18\x08 \x03(\x0b\x32\x1d.uworker_msg.DataBundleCorpusB\t\n\x07_fuzzerB\x0e\n\x0c_fuzzer_nameB\x18\n\x16_fuzzer_log_upload_urlB\x16\n\x14_fuzzer_download_urlB\x18\n\x16_testcase_download_url\")\n\x10\x41nalyzeTaskInput\x12\x15\n\rbad_revisions\x18\x01 \x03(\x03\"P\n\x12SymbolizeTaskInput\x12!\n\x14old_crash_stacktrace\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_old_crash_stacktrace\"C\n\rBlobUploadUrl\x12\x10\n\x03key\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x03url\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_keyB\x06\n\x04_url\"\xcb\x04\n\rFuzzTaskInput\x12\'\n\x1asample_testcase_upload_key\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\'\n\x1asample_testcase_upload_url\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\"\n\x15script_log_upload_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12.\n\x0b\x66uzz_target\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x03\x88\x01\x01\x12\x32\n\x06\x63orpus\x18\x05 \x01(\x0b\x32\x1d.uworker_msg.FuzzTargetCorpusH\x04\x88\x01\x01\x12$\n\x1cglobal_blacklisted_functions\x18\x06 \x03(\t\x12\x35\n\x11\x63rash_upload_urls\x18\x07 \x03(\x0b\x32\x1a.uworker_msg.BlobUploadUrl\x12$\n\x06trials\x18\x08 \x03(\x0b\x32\x14.google.protobuf.Any\x12\x1a\n\rweb_tests_url\x18\t \x01(\tH\x05\x88\x01\x01\x12\"\n\x15script_log_upload_key\x18\n \x01(\tH\x06\x88\x01\x01\x42\x1d\n\x1b_sample_testcase_upload_keyB\x1d\n\x1b_sample_testcase_upload_urlB\x18\n\x16_script_log_upload_urlB\x0e\n\x0c_fuzz_targetB\t\n\x07_corpusB\x10\n\x0e_web_tests_urlB\x18\n\x16_script_log_upload_key\"\x89\x01\n\x10\x44\x61taBundleCorpus\x12.\n\x0b\x64\x61ta_bundle\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\x14\n\x07gcs_url\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x0b\x63orpus_urls\x18\x03 \x03(\tB\x0e\n\x0c_data_bundleB\n\n\x08_gcs_url\"\x82\x02\n\x10\x46uzzTargetCorpus\x12(\n\x06\x63orpus\x18\x01 \x01(\x0b\x32\x13.uworker_msg.CorpusH\x00\x88\x01\x01\x12\x34\n\x12regressions_corpus\x18\x02 \x01(\x0b\x32\x13.uworker_msg.CorpusH\x01\x88\x01\x01\x12\x13\n\x06\x65ngine\x18\x03 \x01(\tH\x02\x88\x01\x01\x12*\n\x1dproject_qualified_target_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\t\n\x07_corpusB\x15\n\x13_regressions_corpusB\t\n\x07_engineB \n\x1e_project_qualified_target_name\"\xa6\x02\n\x06\x43orpus\x12\x38\n\x0b\x63orpus_urls\x18\x01 \x03(\x0b\x32#.uworker_msg.Corpus.CorpusUrlsEntry\x12:\n\x11last_updated_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x88\x01\x01\x12\x14\n\x07gcs_url\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x0bupload_urls\x18\x04 \x03(\t\x12\x17\n\nbackup_url\x18\x05 \x01(\tH\x02\x88\x01\x01\x1a\x31\n\x0f\x43orpusUrlsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x14\n\x12_last_updated_timeB\n\n\x08_gcs_urlB\r\n\x0b_backup_url\"\x92\x02\n\x11MinimizeTaskInput\x12 \n\x13testcase_upload_url\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1f\n\x12testcase_blob_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12!\n\x14stacktrace_blob_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\"\n\x15stacktrace_upload_url\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x11\n\targuments\x18\x05 \x03(\tB\x16\n\x14_testcase_upload_urlB\x15\n\x13_testcase_blob_nameB\x17\n\x15_stacktrace_blob_nameB\x18\n\x16_stacktrace_upload_url\",\n\x13RegressionTaskInput\x12\x15\n\rbad_revisions\x18\x01 \x03(\x03\"\x81\x02\n\x14ProgressionTaskInput\x12\x1a\n\rcustom_binary\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x15\n\rbad_revisions\x18\x02 \x03(\x03\x12$\n\x17regression_testcase_url\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tblob_name\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\"\n\x15stacktrace_upload_url\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x10\n\x0e_custom_binaryB\x1a\n\x18_regression_testcase_urlB\x0c\n\n_blob_nameB\x18\n\x16_stacktrace_upload_url\"\xcb\x01\n\x19\x43rossPollinateFuzzerProto\x12.\n\x0b\x66uzz_target\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\x1f\n\x12\x62\x61\x63kup_bucket_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12\x63orpus_engine_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0e\n\x0c_fuzz_targetB\x15\n\x13_backup_bucket_nameB\x15\n\x13_corpus_engine_name\"\xb9\x05\n\x16\x43orpusPruningTaskInput\x12.\n\x0b\x66uzz_target\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\"\n\x15last_execution_failed\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12G\n\x17\x63ross_pollinate_fuzzers\x18\x03 \x03(\x0b\x32&.uworker_msg.CrossPollinateFuzzerProto\x12\x32\n\x06\x63orpus\x18\x04 \x01(\x0b\x32\x1d.uworker_msg.FuzzTargetCorpusH\x02\x88\x01\x01\x12=\n\x11quarantine_corpus\x18\x05 \x01(\x0b\x32\x1d.uworker_msg.FuzzTargetCorpusH\x03\x88\x01\x01\x12%\n\x18\x63orpus_crashes_blob_name\x18\x06 \x01(\tH\x04\x88\x01\x01\x12&\n\x19\x63orpus_crashes_upload_url\x18\x07 \x01(\tH\x05\x88\x01\x01\x12!\n\x14\x64\x61ted_backup_gcs_url\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\"\n\x15latest_backup_gcs_url\x18\t \x01(\tH\x07\x88\x01\x01\x12$\n\x17\x64\x61ted_backup_signed_url\x18\n \x01(\tH\x08\x88\x01\x01\x42\x0e\n\x0c_fuzz_targetB\x18\n\x16_last_execution_failedB\t\n\x07_corpusB\x14\n\x12_quarantine_corpusB\x1b\n\x19_corpus_crashes_blob_nameB\x1c\n\x1a_corpus_crashes_upload_urlB\x17\n\x15_dated_backup_gcs_urlB\x18\n\x16_latest_backup_gcs_urlB\x1a\n\x18_dated_backup_signed_url\"\xd3\x0b\n\x05Input\x12+\n\x08testcase\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12;\n\x18testcase_upload_metadata\x18\x02 \x01(\x0b\x32\x14.google.protobuf.AnyH\x01\x88\x01\x01\x12\x18\n\x0btestcase_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x37\n\x0buworker_env\x18\x04 \x03(\x0b\x32\".uworker_msg.Input.UworkerEnvEntry\x12\x15\n\x08job_type\x18\x06 \x01(\tH\x03\x88\x01\x01\x12&\n\x19uworker_output_upload_url\x18\x07 \x01(\tH\x04\x88\x01\x01\x12>\n\x12variant_task_input\x18\x08 \x01(\x0b\x32\x1d.uworker_msg.VariantTaskInputH\x05\x88\x01\x01\x12\x18\n\x0b\x66uzzer_name\x18\t \x01(\tH\x06\x88\x01\x01\x12\x31\n\x0bsetup_input\x18\n \x01(\x0b\x32\x17.uworker_msg.SetupInputH\x07\x88\x01\x01\x12>\n\x12\x61nalyze_task_input\x18\x0b \x01(\x0b\x32\x1d.uworker_msg.AnalyzeTaskInputH\x08\x88\x01\x01\x12K\n\x19\x63orpus_pruning_task_input\x18\x0c \x01(\x0b\x32#.uworker_msg.CorpusPruningTaskInputH\t\x88\x01\x01\x12\x38\n\x0f\x66uzz_task_input\x18\r \x01(\x0b\x32\x1a.uworker_msg.FuzzTaskInputH\n\x88\x01\x01\x12@\n\x13minimize_task_input\x18\x0e \x01(\x0b\x32\x1e.uworker_msg.MinimizeTaskInputH\x0b\x88\x01\x01\x12\x46\n\x16progression_task_input\x18\x0f \x01(\x0b\x32!.uworker_msg.ProgressionTaskInputH\x0c\x88\x01\x01\x12\x44\n\x15regression_task_input\x18\x10 \x01(\x0b\x32 .uworker_msg.RegressionTaskInputH\r\x88\x01\x01\x12\x42\n\x14symbolize_task_input\x18\x11 \x01(\x0b\x32\x1f.uworker_msg.SymbolizeTaskInputH\x0e\x88\x01\x01\x12\x18\n\x0bmodule_name\x18\x12 \x01(\tH\x0f\x88\x01\x01\x12>\n\x15preprocess_start_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x10\x88\x01\x01\x12$\n\x1cglobal_blacklisted_functions\x18\x14 \x03(\t\x12.\n\x0b\x66uzz_target\x18\x15 \x01(\x0b\x32\x14.google.protobuf.AnyH\x11\x88\x01\x01\x1a\x31\n\x0fUworkerEnvEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0b\n\t_testcaseB\x1b\n\x19_testcase_upload_metadataB\x0e\n\x0c_testcase_idB\x0b\n\t_job_typeB\x1c\n\x1a_uworker_output_upload_urlB\x15\n\x13_variant_task_inputB\x0e\n\x0c_fuzzer_nameB\x0e\n\x0c_setup_inputB\x15\n\x13_analyze_task_inputB\x1c\n\x1a_corpus_pruning_task_inputB\x12\n\x10_fuzz_task_inputB\x16\n\x14_minimize_task_inputB\x19\n\x17_progression_task_inputB\x18\n\x16_regression_task_inputB\x17\n\x15_symbolize_task_inputB\x0e\n\x0c_module_nameB\x18\n\x16_preprocess_start_timeB\x0e\n\x0c_fuzz_target\"H\n\x10VariantTaskInput\x12\x1e\n\x11original_job_type\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x14\n\x12_original_job_type\"\xc7\x02\n\x13SymbolizeTaskOutput\x12\x17\n\ncrash_type\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nsymbolized\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x06 \x01(\x03H\x05\x88\x01\x01\x12\x16\n\tbuild_url\x18\x07 \x01(\tH\x06\x88\x01\x01\x42\r\n\x0b_crash_typeB\x10\n\x0e_crash_addressB\x0e\n\x0c_crash_stateB\x13\n\x11_crash_stacktraceB\r\n\x0b_symbolizedB\x11\n\x0f_crash_revisionB\x0c\n\n_build_url\"\x93\x06\n\x11\x41nalyzeTaskOutput\x12\x1b\n\x0e\x63rash_revision\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x1a\n\rabsolute_path\x18\x02 \x01(\tH\x01\x88\x01\x01\x12 \n\x13minimized_arguments\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0e\x63rash_info_set\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x16\n\thttp_flag\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x17\n\ncrash_type\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\t \x01(\tH\x08\x88\x01\x01\x12\x1a\n\rsecurity_flag\x18\n \x01(\x08H\t\x88\x01\x01\x12\x1e\n\x11security_severity\x18\x0b \x01(\x05H\n\x88\x01\x01\x12\"\n\x15one_time_crasher_flag\x18\x0c \x01(\x08H\x0b\x88\x01\x01\x12\x16\n\tbuild_key\x18\r \x01(\tH\x0c\x88\x01\x01\x12\x16\n\tbuild_url\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x14\n\x07gn_args\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x15\n\x08platform\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x18\n\x0bplatform_id\x18\x11 \x01(\tH\x10\x88\x01\x01\x42\x11\n\x0f_crash_revisionB\x10\n\x0e_absolute_pathB\x16\n\x14_minimized_argumentsB\x13\n\x11_crash_stacktraceB\x11\n\x0f_crash_info_setB\x0c\n\n_http_flagB\r\n\x0b_crash_typeB\x10\n\x0e_crash_addressB\x0e\n\x0c_crash_stateB\x10\n\x0e_security_flagB\x14\n\x12_security_severityB\x18\n\x16_one_time_crasher_flagB\x0c\n\n_build_keyB\x0c\n\n_build_urlB\n\n\x08_gn_argsB\x0b\n\t_platformB\x0e\n\x0c_platform_id\"\xd1\x02\n\tCrashInfo\x12\x13\n\x06is_new\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x17\n\ncrash_type\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rsecurity_flag\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x16\n\tunit_path\x18\t \x01(\tH\x07\x88\x01\x01\x42\t\n\x07_is_newB\x08\n\x06_countB\r\n\x0b_crash_typeB\x0e\n\x0c_crash_stateB\x10\n\x0e_security_flagB\x10\n\x0e_crash_addressB\x13\n\x11_crash_stacktraceB\x0c\n\n_unit_path\"\xcb\x01\n\x1bStoreFuzzerRunResultsOutput\x12\x1f\n\x12\x66uzzer_return_code\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12&\n\x19generated_testcase_string\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0e\x63onsole_output\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x15\n\x13_fuzzer_return_codeB\x1c\n\x1a_generated_testcase_stringB\x11\n\x0f_console_output\"\xc8\x07\n\rFuzzTaskCrash\x12\x16\n\tfile_path\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ncrash_time\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0breturn_code\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x15\n\rresource_list\x18\x04 \x03(\t\x12\x10\n\x08gestures\x18\x05 \x03(\t\x12\x16\n\targuments\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\x12\x66uzzing_strategies\x18\x07 \x03(\t\x12\x1a\n\rsecurity_flag\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x11should_be_ignored\x18\t \x01(\x08H\x05\x88\x01\x01\x12\x16\n\thttp_flag\x18\n \x01(\x08H\x06\x88\x01\x01\x12%\n\x18\x61pplication_command_line\x18\x0b \x01(\tH\x07\x88\x01\x01\x12*\n\x1dunsymbolized_crash_stacktrace\x18\x0c \x01(\tH\x08\x88\x01\x01\x12\x17\n\ncrash_type\x18\r \x01(\tH\t\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x0e \x01(\tH\n\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x0f \x01(\tH\x0b\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x10 \x01(\tH\x0c\x88\x01\x01\x12\x18\n\x10\x63rash_categories\x18\x11 \x03(\t\x12\x10\n\x03key\x18\x12 \x01(\tH\r\x88\x01\x01\x12\x15\n\x08is_valid\x18\x14 \x01(\x08H\x0e\x88\x01\x01\x12\x17\n\nfuzzed_key\x18\x15 \x01(\tH\x0f\x88\x01\x01\x12\x1a\n\rabsolute_path\x18\x16 \x01(\tH\x10\x88\x01\x01\x12\x1d\n\x10\x61rchive_filename\x18\x17 \x01(\tH\x11\x88\x01\x01\x12\x15\n\x08\x61rchived\x18\x18 \x01(\x08H\x12\x88\x01\x01\x42\x0c\n\n_file_pathB\r\n\x0b_crash_timeB\x0e\n\x0c_return_codeB\x0c\n\n_argumentsB\x10\n\x0e_security_flagB\x14\n\x12_should_be_ignoredB\x0c\n\n_http_flagB\x1b\n\x19_application_command_lineB \n\x1e_unsymbolized_crash_stacktraceB\r\n\x0b_crash_typeB\x10\n\x0e_crash_addressB\x0e\n\x0c_crash_stateB\x13\n\x11_crash_stacktraceB\x06\n\x04_keyB\x0b\n\t_is_validB\r\n\x0b_fuzzed_keyB\x10\n\x0e_absolute_pathB\x13\n\x11_archive_filenameB\x0b\n\t_archived\"\xf1\x02\n\x0b\x46uzzContext\x12\x14\n\x07redzone\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x1a\n\rdisable_ubsan\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x1c\n\x0fwindow_argument\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1f\n\x12timeout_multiplier\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x19\n\x0ctest_timeout\x18\x05 \x01(\x05H\x04\x88\x01\x01\x12\x45\n\x0f\x66uzzer_metadata\x18\x06 \x03(\x0b\x32,.uworker_msg.FuzzContext.FuzzerMetadataEntry\x1a\x35\n\x13\x46uzzerMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\n\n\x08_redzoneB\x10\n\x0e_disable_ubsanB\x12\n\x10_window_argumentB\x15\n\x13_timeout_multiplierB\x0f\n\r_test_timeout\"\xff\x01\n\x12\x46uzzTaskCrashGroup\x12.\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x18.uworker_msg.FuzzContextH\x00\x88\x01\x01\x12+\n\x07\x63rashes\x18\x02 \x03(\x0b\x32\x1a.uworker_msg.FuzzTaskCrash\x12\x33\n\nmain_crash\x18\x03 \x01(\x0b\x32\x1a.uworker_msg.FuzzTaskCrashH\x01\x88\x01\x01\x12\"\n\x15one_time_crasher_flag\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\n\n\x08_contextB\r\n\x0b_main_crashB\x18\n\x16_one_time_crasher_flag\"\xae\x01\n\x0f\x46uzzerRunOutput\x12\x13\n\x06output\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0breturn_code\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12-\n\ttimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\x08testcase\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x42\t\n\x07_outputB\x0e\n\x0c_return_codeB\x0b\n\t_testcase\"\x94\t\n\x0e\x46uzzTaskOutput\x12(\n\x1b\x66ully_qualified_fuzzer_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1e\n\x11job_run_timestamp\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1f\n\x12testcases_executed\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12I\n\x12\x66uzzer_run_results\x18\x08 \x01(\x0b\x32(.uworker_msg.StoreFuzzerRunResultsOutputH\x04\x88\x01\x01\x12\x1e\n\x11new_targets_count\x18\t \x01(\x05H\x05\x88\x01\x01\x12\x1c\n\x0f\x66uzzer_revision\x18\n \x01(\x05H\x06\x88\x01\x01\x12\x14\n\x0c\x66uzz_targets\x18\x0b \x03(\t\x12\x1a\n\x12testcase_run_jsons\x18\x0c \x03(\t\x12\x35\n\x0c\x63rash_groups\x18\r \x03(\x0b\x32\x1f.uworker_msg.FuzzTaskCrashGroup\x12/\n\nbuild_data\x18\x0e \x01(\x0b\x32\x16.uworker_msg.BuildDataH\x07\x88\x01\x01\x12\x19\n\x0c\x61pp_revision\x18\x0f \x01(\x03H\x08\x88\x01\x01\x12\x38\n\x12\x66uzzer_run_outputs\x18\x10 \x03(\x0b\x32\x1c.uworker_msg.FuzzerRunOutput\x12\x16\n\tbuild_key\x18\x11 \x01(\tH\t\x88\x01\x01\x12\x16\n\tbuild_url\x18\x12 \x01(\tH\n\x88\x01\x01\x12\x14\n\x07gn_args\x18\x13 \x01(\tH\x0b\x88\x01\x01\x12 \n\x13testcases_generated\x18\x14 \x01(\x03H\x0c\x88\x01\x01\x12\x44\n\x1ctestcase_generation_duration\x18\x15 \x01(\x0b\x32\x19.google.protobuf.DurationH\r\x88\x01\x01\x12\x43\n\x1btestcase_execution_duration\x18\x16 \x01(\x0b\x32\x19.google.protobuf.DurationH\x0e\x88\x01\x01\x12\x38\n\x10\x66uzzing_duration\x18\x17 \x01(\x0b\x32\x19.google.protobuf.DurationH\x0f\x88\x01\x01\x42\x1e\n\x1c_fully_qualified_fuzzer_nameB\x11\n\x0f_crash_revisionB\x14\n\x12_job_run_timestampB\x15\n\x13_testcases_executedB\x15\n\x13_fuzzer_run_resultsB\x14\n\x12_new_targets_countB\x12\n\x10_fuzzer_revisionB\r\n\x0b_build_dataB\x0f\n\r_app_revisionB\x0c\n\n_build_keyB\x0c\n\n_build_urlB\n\n\x08_gn_argsB\x16\n\x14_testcases_generatedB\x1f\n\x1d_testcase_generation_durationB\x1e\n\x1c_testcase_execution_durationB\x13\n\x11_fuzzing_duration\"\xef\x05\n\x12MinimizeTaskOutput\x12X\n\x16last_crash_result_dict\x18\x01 \x03(\x0b\x32\x38.uworker_msg.MinimizeTaskOutput.LastCrashResultDictEntry\x12\x18\n\x0b\x66laky_stack\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12&\n\x19security_severity_updated\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x1e\n\x11security_severity\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1f\n\x12minimization_phase\x18\x05 \x01(\x05H\x03\x88\x01\x01\x12\x10\n\x08gestures\x18\x06 \x03(\t\x12\x1b\n\x0eminimized_keys\x18\x07 \x01(\tH\x04\x88\x01\x01\x12 \n\x13minimized_arguments\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\x1a\n\rarchive_state\x18\t \x01(\x05H\x06\x88\x01\x01\x12\x1a\n\rabsolute_path\x18\n \x01(\tH\x07\x88\x01\x01\x12S\n\x13memory_tool_options\x18\x0b \x03(\x0b\x32\x36.uworker_msg.MinimizeTaskOutput.MemoryToolOptionsEntry\x1a:\n\x18LastCrashResultDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x38\n\x16MemoryToolOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0e\n\x0c_flaky_stackB\x1c\n\x1a_security_severity_updatedB\x14\n\x12_security_severityB\x15\n\x13_minimization_phaseB\x11\n\x0f_minimized_keysB\x16\n\x14_minimized_argumentsB\x10\n\x0e_archive_stateB\x10\n\x0e_absolute_path\"\xfb\x02\n\x14RegressionTaskOutput\x12#\n\x16regression_range_start\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12!\n\x14regression_range_end\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12 \n\x13last_regression_min\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12 \n\x13last_regression_max\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12/\n\x0f\x62uild_data_list\x18\x05 \x03(\x0b\x32\x16.uworker_msg.BuildData\x12%\n\x18is_testcase_reproducible\x18\x06 \x01(\x08H\x04\x88\x01\x01\x42\x19\n\x17_regression_range_startB\x17\n\x15_regression_range_endB\x16\n\x14_last_regression_minB\x16\n\x14_last_regression_maxB\x1b\n\x19_is_testcase_reproducible\"\xa3\x02\n\x11VariantTaskOutput\x12\x13\n\x06status\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x15\n\x08revision\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x17\n\ncrash_type\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rsecurity_flag\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x17\n\nis_similar\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x15\n\x08platform\x18\x07 \x01(\tH\x06\x88\x01\x01\x42\t\n\x07_statusB\x0b\n\t_revisionB\r\n\x0b_crash_typeB\x0e\n\x0c_crash_stateB\x10\n\x0e_security_flagB\r\n\x0b_is_similarB\x0b\n\t_platform\"\xe7\x01\n\tBuildData\x12\x15\n\x08revision\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x19\n\x0cis_bad_build\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\'\n\x1ashould_ignore_crash_result\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12%\n\x18\x62uild_run_console_output\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0b\n\t_revisionB\x0f\n\r_is_bad_buildB\x1d\n\x1b_should_ignore_crash_resultB\x1b\n\x19_build_run_console_output\"\xc8\x04\n\x15ProgressionTaskOutput\x12\x19\n\x0cmin_revision\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x19\n\x0cmax_revision\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x1c\n\x0f\x63rash_on_latest\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12$\n\x17\x63rash_on_latest_message\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x05 \x01(\x03H\x04\x88\x01\x01\x12)\n\x1clast_tested_crash_stacktrace\x18\x06 \x01(\tH\x05\x88\x01\x01\x12!\n\x14last_progression_min\x18\x07 \x01(\x03H\x06\x88\x01\x01\x12!\n\x14last_progression_max\x18\x08 \x01(\x03H\x07\x88\x01\x01\x12#\n\x16\x63lear_min_max_metadata\x18\t \x01(\x08H\x08\x88\x01\x01\x12/\n\x0f\x62uild_data_list\x18\x0b \x03(\x0b\x32\x16.uworker_msg.BuildDataB\x0f\n\r_min_revisionB\x0f\n\r_max_revisionB\x12\n\x10_crash_on_latestB\x1a\n\x18_crash_on_latest_messageB\x11\n\x0f_crash_revisionB\x1f\n\x1d_last_tested_crash_stacktraceB\x17\n\x15_last_progression_minB\x17\n\x15_last_progression_maxB\x19\n\x17_clear_min_max_metadata\"\xc6\x03\n\x1a\x43rossPollinationStatistics\x12#\n\x16project_qualified_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07sources\x18\x02 \x01(\tH\x01\x88\x01\x01\x12 \n\x13initial_corpus_size\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12\x18\n\x0b\x63orpus_size\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12\"\n\x15initial_edge_coverage\x18\x05 \x01(\x03H\x04\x88\x01\x01\x12\x1a\n\redge_coverage\x18\x06 \x01(\x03H\x05\x88\x01\x01\x12%\n\x18initial_feature_coverage\x18\x07 \x01(\x03H\x06\x88\x01\x01\x12\x1d\n\x10\x66\x65\x61ture_coverage\x18\x08 \x01(\x03H\x07\x88\x01\x01\x42\x19\n\x17_project_qualified_nameB\n\n\x08_sourcesB\x16\n\x14_initial_corpus_sizeB\x0e\n\x0c_corpus_sizeB\x18\n\x16_initial_edge_coverageB\x10\n\x0e_edge_coverageB\x1b\n\x19_initial_feature_coverageB\x13\n\x11_feature_coverage\"\x97\x04\n\x13\x43overageInformation\x12\x19\n\x0cproject_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x32\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x12\x1e\n\x11\x63orpus_size_units\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12\x1e\n\x11\x63orpus_size_bytes\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12\x1c\n\x0f\x63orpus_location\x18\x05 \x01(\tH\x04\x88\x01\x01\x12#\n\x16\x63orpus_backup_location\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\"\n\x15quarantine_size_units\x18\x07 \x01(\x03H\x06\x88\x01\x01\x12\"\n\x15quarantine_size_bytes\x18\x08 \x01(\x03H\x07\x88\x01\x01\x12 \n\x13quarantine_location\x18\t \x01(\tH\x08\x88\x01\x01\x42\x0f\n\r_project_nameB\x0c\n\n_timestampB\x14\n\x12_corpus_size_unitsB\x14\n\x12_corpus_size_bytesB\x12\n\x10_corpus_locationB\x19\n\x17_corpus_backup_locationB\x18\n\x16_quarantine_size_unitsB\x18\n\x16_quarantine_size_bytesB\x16\n\x14_quarantine_location\"\xa5\x03\n\x17\x43orpusPruningTaskOutput\x12M\n\x17\x63ross_pollination_stats\x18\x01 \x01(\x0b\x32\'.uworker_msg.CrossPollinationStatisticsH\x00\x88\x01\x01\x12<\n\rcoverage_info\x18\x02 \x01(\x0b\x32 .uworker_msg.CoverageInformationH\x01\x88\x01\x01\x12\x1f\n\x12\x66uzzer_binary_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12\'\n\x07\x63rashes\x18\x05 \x03(\x0b\x32\x16.uworker_msg.CrashInfo\x12#\n\x16\x63orpus_backup_uploaded\x18\x06 \x01(\x08H\x04\x88\x01\x01\x42\x1a\n\x18_cross_pollination_statsB\x10\n\x0e_coverage_infoB\x15\n\x13_fuzzer_binary_nameB\x11\n\x0f_crash_revisionB\x19\n\x17_corpus_backup_uploaded\"\xc5\t\n\x06Output\x12/\n\nerror_type\x18\x03 \x01(\x0e\x32\x16.uworker_msg.ErrorTypeH\x00\x88\x01\x01\x12.\n\ruworker_input\x18\x04 \x01(\x0b\x32\x12.uworker_msg.InputH\x01\x88\x01\x01\x12\x19\n\x0ctest_timeout\x18\x05 \x01(\x02H\x02\x88\x01\x01\x12\x17\n\ncrash_time\x18\x06 \x01(\x02H\x03\x88\x01\x01\x12$\n\x17\x63rash_stacktrace_output\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x15\n\x08\x62ot_name\x18\x12 \x01(\tH\x05\x88\x01\x01\x12\x18\n\x0bplatform_id\x18\x13 \x01(\tH\x06\x88\x01\x01\x12@\n\x13\x61nalyze_task_output\x18\x08 \x01(\x0b\x32\x1e.uworker_msg.AnalyzeTaskOutputH\x07\x88\x01\x01\x12:\n\x10\x66uzz_task_output\x18\t \x01(\x0b\x32\x1b.uworker_msg.FuzzTaskOutputH\x08\x88\x01\x01\x12\x42\n\x14minimize_task_output\x18\n \x01(\x0b\x32\x1f.uworker_msg.MinimizeTaskOutputH\t\x88\x01\x01\x12\x46\n\x16regression_task_output\x18\x0b \x01(\x0b\x32!.uworker_msg.RegressionTaskOutputH\n\x88\x01\x01\x12H\n\x17progression_task_output\x18\x0c \x01(\x0b\x32\".uworker_msg.ProgressionTaskOutputH\x0b\x88\x01\x01\x12\x44\n\x15symbolize_task_output\x18\r \x01(\x0b\x32 .uworker_msg.SymbolizeTaskOutputH\x0c\x88\x01\x01\x12@\n\x13variant_task_output\x18\x0e \x01(\x0b\x32\x1e.uworker_msg.VariantTaskOutputH\r\x88\x01\x01\x12M\n\x1a\x63orpus_pruning_task_output\x18\x10 \x01(\x0b\x32$.uworker_msg.CorpusPruningTaskOutputH\x0e\x88\x01\x01\x12\x1b\n\x0eissue_metadata\x18\x14 \x01(\tH\x0f\x88\x01\x01\x12\x1a\n\rerror_message\x18\x0f \x01(\tH\x10\x88\x01\x01\x42\r\n\x0b_error_typeB\x10\n\x0e_uworker_inputB\x0f\n\r_test_timeoutB\r\n\x0b_crash_timeB\x1a\n\x18_crash_stacktrace_outputB\x0b\n\t_bot_nameB\x0e\n\x0c_platform_idB\x16\n\x14_analyze_task_outputB\x13\n\x11_fuzz_task_outputB\x17\n\x15_minimize_task_outputB\x19\n\x17_regression_task_outputB\x1a\n\x18_progression_task_outputB\x18\n\x16_symbolize_task_outputB\x16\n\x14_variant_task_outputB\x1d\n\x1b_corpus_pruning_task_outputB\x11\n\x0f_issue_metadataB\x10\n\x0e_error_message*\x95\t\n\tErrorType\x12\x0c\n\x08NO_ERROR\x10\x00\x12\x17\n\x13\x41NALYZE_BUILD_SETUP\x10\x01\x12\x14\n\x10\x41NALYZE_NO_CRASH\x10\x02\x12\x1d\n\x19\x41NALYZE_NO_REVISIONS_LIST\x10\x03\x12\x1d\n\x19\x41NALYZE_NO_REVISION_INDEX\x10\x04\x12\x12\n\x0eTESTCASE_SETUP\x10\x05\x12\r\n\tUNHANDLED\x10\x06\x12\x17\n\x13VARIANT_BUILD_SETUP\x10\x07\x12\x12\n\x0eMINIMIZE_SETUP\x10\x08\x12\x1c\n\x18\x46UZZ_BUILD_SETUP_FAILURE\x10\t\x12\"\n\x1e\x46UZZ_DATA_BUNDLE_SETUP_FAILURE\x10\n\x12\x12\n\x0e\x46UZZ_NO_FUZZER\x10\x0b\x12 \n\x1c\x46UZZ_NO_FUZZ_TARGET_SELECTED\x10\r\x12#\n\x1fPROGRESSION_REVISION_LIST_ERROR\x10\x0e\x12\x1f\n\x1bPROGRESSION_BUILD_NOT_FOUND\x10\x0f\x12\x18\n\x14PROGRESSION_NO_CRASH\x10\x10\x12!\n\x1dPROGRESSION_BAD_STATE_MIN_MAX\x10\x11\x12\x17\n\x13PROGRESSION_TIMEOUT\x10\x12\x12\x19\n\x15PROGRESSION_BAD_BUILD\x10\x13\x12!\n\x1dPROGRESSION_BUILD_SETUP_ERROR\x10\x14\x12\"\n\x1eREGRESSION_REVISION_LIST_ERROR\x10\x15\x12\x1e\n\x1aREGRESSION_BUILD_NOT_FOUND\x10\x16\x12 \n\x1cREGRESSION_BUILD_SETUP_ERROR\x10\x17\x12\x1e\n\x1aREGRESSION_BAD_BUILD_ERROR\x10\x18\x12\x17\n\x13REGRESSION_NO_CRASH\x10\x19\x12\x1c\n\x18REGRESSION_TIMEOUT_ERROR\x10\x1a\x12\x31\n-REGRESSION_LOW_CONFIDENCE_IN_REGRESSION_RANGE\x10\x1b\x12\x1f\n\x1bSYMBOLIZE_BUILD_SETUP_ERROR\x10\x1c\x12!\n\x1dMINIMIZE_UNREPRODUCIBLE_CRASH\x10\x1d\x12\x1c\n\x18MINIMIZE_CRASH_TOO_FLAKY\x10\x1e\x12\x1e\n\x1aMINIMIZE_DEADLINE_EXCEEDED\x10\x1f\x12\x31\n-MINIMIZE_DEADLINE_EXCEEDED_IN_MAIN_FILE_PHASE\x10 \x12)\n%LIBFUZZER_MINIMIZATION_UNREPRODUCIBLE\x10!\x12!\n\x1dLIBFUZZER_MINIMIZATION_FAILED\x10\"\x12&\n\"CORPUS_PRUNING_FUZZER_SETUP_FAILED\x10#\x12\x18\n\x14\x43ORPUS_PRUNING_ERROR\x10$\x12\x12\n\x0e\x46UZZ_BAD_BUILD\x10%\x12\"\n\x1e\x41NALYZE_CLOSE_INVALID_UPLOADED\x10&b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.clusterfuzz/_internal/protos/uworker_msg.proto\x12\x0buworker_msg\x1a\x19google/protobuf/any.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/duration.proto\"\x85\x03\n\nSetupInput\x12)\n\x06\x66uzzer\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\x18\n\x0b\x66uzzer_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\"\n\x15\x66uzzer_log_upload_url\x18\x04 \x01(\tH\x02\x88\x01\x01\x12 \n\x13\x66uzzer_download_url\x18\x05 \x01(\tH\x03\x88\x01\x01\x12\"\n\x15testcase_download_url\x18\x06 \x01(\tH\x04\x88\x01\x01\x12$\n\x1cglobal_blacklisted_functions\x18\x07 \x03(\t\x12;\n\x14\x64\x61ta_bundle_corpuses\x18\x08 \x03(\x0b\x32\x1d.uworker_msg.DataBundleCorpusB\t\n\x07_fuzzerB\x0e\n\x0c_fuzzer_nameB\x18\n\x16_fuzzer_log_upload_urlB\x16\n\x14_fuzzer_download_urlB\x18\n\x16_testcase_download_url\")\n\x10\x41nalyzeTaskInput\x12\x15\n\rbad_revisions\x18\x01 \x03(\x03\"P\n\x12SymbolizeTaskInput\x12!\n\x14old_crash_stacktrace\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x17\n\x15_old_crash_stacktrace\"C\n\rBlobUploadUrl\x12\x10\n\x03key\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x03url\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x06\n\x04_keyB\x06\n\x04_url\"\xcb\x04\n\rFuzzTaskInput\x12\'\n\x1asample_testcase_upload_key\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\'\n\x1asample_testcase_upload_url\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\"\n\x15script_log_upload_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12.\n\x0b\x66uzz_target\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyH\x03\x88\x01\x01\x12\x32\n\x06\x63orpus\x18\x05 \x01(\x0b\x32\x1d.uworker_msg.FuzzTargetCorpusH\x04\x88\x01\x01\x12$\n\x1cglobal_blacklisted_functions\x18\x06 \x03(\t\x12\x35\n\x11\x63rash_upload_urls\x18\x07 \x03(\x0b\x32\x1a.uworker_msg.BlobUploadUrl\x12$\n\x06trials\x18\x08 \x03(\x0b\x32\x14.google.protobuf.Any\x12\x1a\n\rweb_tests_url\x18\t \x01(\tH\x05\x88\x01\x01\x12\"\n\x15script_log_upload_key\x18\n \x01(\tH\x06\x88\x01\x01\x42\x1d\n\x1b_sample_testcase_upload_keyB\x1d\n\x1b_sample_testcase_upload_urlB\x18\n\x16_script_log_upload_urlB\x0e\n\x0c_fuzz_targetB\t\n\x07_corpusB\x10\n\x0e_web_tests_urlB\x18\n\x16_script_log_upload_key\"\x89\x01\n\x10\x44\x61taBundleCorpus\x12.\n\x0b\x64\x61ta_bundle\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\x14\n\x07gcs_url\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x0b\x63orpus_urls\x18\x03 \x03(\tB\x0e\n\x0c_data_bundleB\n\n\x08_gcs_url\"\x82\x02\n\x10\x46uzzTargetCorpus\x12(\n\x06\x63orpus\x18\x01 \x01(\x0b\x32\x13.uworker_msg.CorpusH\x00\x88\x01\x01\x12\x34\n\x12regressions_corpus\x18\x02 \x01(\x0b\x32\x13.uworker_msg.CorpusH\x01\x88\x01\x01\x12\x13\n\x06\x65ngine\x18\x03 \x01(\tH\x02\x88\x01\x01\x12*\n\x1dproject_qualified_target_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\t\n\x07_corpusB\x15\n\x13_regressions_corpusB\t\n\x07_engineB \n\x1e_project_qualified_target_name\"\xa6\x02\n\x06\x43orpus\x12\x38\n\x0b\x63orpus_urls\x18\x01 \x03(\x0b\x32#.uworker_msg.Corpus.CorpusUrlsEntry\x12:\n\x11last_updated_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x88\x01\x01\x12\x14\n\x07gcs_url\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x0bupload_urls\x18\x04 \x03(\t\x12\x17\n\nbackup_url\x18\x05 \x01(\tH\x02\x88\x01\x01\x1a\x31\n\x0f\x43orpusUrlsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x14\n\x12_last_updated_timeB\n\n\x08_gcs_urlB\r\n\x0b_backup_url\"\x92\x02\n\x11MinimizeTaskInput\x12 \n\x13testcase_upload_url\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1f\n\x12testcase_blob_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12!\n\x14stacktrace_blob_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\"\n\x15stacktrace_upload_url\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x11\n\targuments\x18\x05 \x03(\tB\x16\n\x14_testcase_upload_urlB\x15\n\x13_testcase_blob_nameB\x17\n\x15_stacktrace_blob_nameB\x18\n\x16_stacktrace_upload_url\",\n\x13RegressionTaskInput\x12\x15\n\rbad_revisions\x18\x01 \x03(\x03\"\x81\x02\n\x14ProgressionTaskInput\x12\x1a\n\rcustom_binary\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x15\n\rbad_revisions\x18\x02 \x03(\x03\x12$\n\x17regression_testcase_url\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tblob_name\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\"\n\x15stacktrace_upload_url\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x10\n\x0e_custom_binaryB\x1a\n\x18_regression_testcase_urlB\x0c\n\n_blob_nameB\x18\n\x16_stacktrace_upload_url\"\xcb\x01\n\x19\x43rossPollinateFuzzerProto\x12.\n\x0b\x66uzz_target\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\x1f\n\x12\x62\x61\x63kup_bucket_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12\x63orpus_engine_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x0e\n\x0c_fuzz_targetB\x15\n\x13_backup_bucket_nameB\x15\n\x13_corpus_engine_name\"\xb9\x05\n\x16\x43orpusPruningTaskInput\x12.\n\x0b\x66uzz_target\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12\"\n\x15last_execution_failed\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12G\n\x17\x63ross_pollinate_fuzzers\x18\x03 \x03(\x0b\x32&.uworker_msg.CrossPollinateFuzzerProto\x12\x32\n\x06\x63orpus\x18\x04 \x01(\x0b\x32\x1d.uworker_msg.FuzzTargetCorpusH\x02\x88\x01\x01\x12=\n\x11quarantine_corpus\x18\x05 \x01(\x0b\x32\x1d.uworker_msg.FuzzTargetCorpusH\x03\x88\x01\x01\x12%\n\x18\x63orpus_crashes_blob_name\x18\x06 \x01(\tH\x04\x88\x01\x01\x12&\n\x19\x63orpus_crashes_upload_url\x18\x07 \x01(\tH\x05\x88\x01\x01\x12!\n\x14\x64\x61ted_backup_gcs_url\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\"\n\x15latest_backup_gcs_url\x18\t \x01(\tH\x07\x88\x01\x01\x12$\n\x17\x64\x61ted_backup_signed_url\x18\n \x01(\tH\x08\x88\x01\x01\x42\x0e\n\x0c_fuzz_targetB\x18\n\x16_last_execution_failedB\t\n\x07_corpusB\x14\n\x12_quarantine_corpusB\x1b\n\x19_corpus_crashes_blob_nameB\x1c\n\x1a_corpus_crashes_upload_urlB\x17\n\x15_dated_backup_gcs_urlB\x18\n\x16_latest_backup_gcs_urlB\x1a\n\x18_dated_backup_signed_url\"\xa9\x0c\n\x05Input\x12+\n\x08testcase\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x88\x01\x01\x12;\n\x18testcase_upload_metadata\x18\x02 \x01(\x0b\x32\x14.google.protobuf.AnyH\x01\x88\x01\x01\x12\x18\n\x0btestcase_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x37\n\x0buworker_env\x18\x04 \x03(\x0b\x32\".uworker_msg.Input.UworkerEnvEntry\x12\x15\n\x08job_type\x18\x06 \x01(\tH\x03\x88\x01\x01\x12&\n\x19uworker_output_upload_url\x18\x07 \x01(\tH\x04\x88\x01\x01\x12>\n\x12variant_task_input\x18\x08 \x01(\x0b\x32\x1d.uworker_msg.VariantTaskInputH\x05\x88\x01\x01\x12\x18\n\x0b\x66uzzer_name\x18\t \x01(\tH\x06\x88\x01\x01\x12\x31\n\x0bsetup_input\x18\n \x01(\x0b\x32\x17.uworker_msg.SetupInputH\x07\x88\x01\x01\x12>\n\x12\x61nalyze_task_input\x18\x0b \x01(\x0b\x32\x1d.uworker_msg.AnalyzeTaskInputH\x08\x88\x01\x01\x12K\n\x19\x63orpus_pruning_task_input\x18\x0c \x01(\x0b\x32#.uworker_msg.CorpusPruningTaskInputH\t\x88\x01\x01\x12\x38\n\x0f\x66uzz_task_input\x18\r \x01(\x0b\x32\x1a.uworker_msg.FuzzTaskInputH\n\x88\x01\x01\x12@\n\x13minimize_task_input\x18\x0e \x01(\x0b\x32\x1e.uworker_msg.MinimizeTaskInputH\x0b\x88\x01\x01\x12\x46\n\x16progression_task_input\x18\x0f \x01(\x0b\x32!.uworker_msg.ProgressionTaskInputH\x0c\x88\x01\x01\x12\x44\n\x15regression_task_input\x18\x10 \x01(\x0b\x32 .uworker_msg.RegressionTaskInputH\r\x88\x01\x01\x12\x42\n\x14symbolize_task_input\x18\x11 \x01(\x0b\x32\x1f.uworker_msg.SymbolizeTaskInputH\x0e\x88\x01\x01\x12\x18\n\x0bmodule_name\x18\x12 \x01(\tH\x0f\x88\x01\x01\x12>\n\x15preprocess_start_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x10\x88\x01\x01\x12$\n\x1cglobal_blacklisted_functions\x18\x14 \x03(\t\x12.\n\x0b\x66uzz_target\x18\x15 \x01(\x0b\x32\x14.google.protobuf.AnyH\x11\x88\x01\x01\x12<\n\x13preprocess_end_time\x18\x16 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x12\x88\x01\x01\x1a\x31\n\x0fUworkerEnvEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0b\n\t_testcaseB\x1b\n\x19_testcase_upload_metadataB\x0e\n\x0c_testcase_idB\x0b\n\t_job_typeB\x1c\n\x1a_uworker_output_upload_urlB\x15\n\x13_variant_task_inputB\x0e\n\x0c_fuzzer_nameB\x0e\n\x0c_setup_inputB\x15\n\x13_analyze_task_inputB\x1c\n\x1a_corpus_pruning_task_inputB\x12\n\x10_fuzz_task_inputB\x16\n\x14_minimize_task_inputB\x19\n\x17_progression_task_inputB\x18\n\x16_regression_task_inputB\x17\n\x15_symbolize_task_inputB\x0e\n\x0c_module_nameB\x18\n\x16_preprocess_start_timeB\x0e\n\x0c_fuzz_targetB\x16\n\x14_preprocess_end_time\"H\n\x10VariantTaskInput\x12\x1e\n\x11original_job_type\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x14\n\x12_original_job_type\"\xc7\x02\n\x13SymbolizeTaskOutput\x12\x17\n\ncrash_type\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x17\n\nsymbolized\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x06 \x01(\x03H\x05\x88\x01\x01\x12\x16\n\tbuild_url\x18\x07 \x01(\tH\x06\x88\x01\x01\x42\r\n\x0b_crash_typeB\x10\n\x0e_crash_addressB\x0e\n\x0c_crash_stateB\x13\n\x11_crash_stacktraceB\r\n\x0b_symbolizedB\x11\n\x0f_crash_revisionB\x0c\n\n_build_url\"\x93\x06\n\x11\x41nalyzeTaskOutput\x12\x1b\n\x0e\x63rash_revision\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x1a\n\rabsolute_path\x18\x02 \x01(\tH\x01\x88\x01\x01\x12 \n\x13minimized_arguments\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0e\x63rash_info_set\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x16\n\thttp_flag\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x17\n\ncrash_type\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x08 \x01(\tH\x07\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\t \x01(\tH\x08\x88\x01\x01\x12\x1a\n\rsecurity_flag\x18\n \x01(\x08H\t\x88\x01\x01\x12\x1e\n\x11security_severity\x18\x0b \x01(\x05H\n\x88\x01\x01\x12\"\n\x15one_time_crasher_flag\x18\x0c \x01(\x08H\x0b\x88\x01\x01\x12\x16\n\tbuild_key\x18\r \x01(\tH\x0c\x88\x01\x01\x12\x16\n\tbuild_url\x18\x0e \x01(\tH\r\x88\x01\x01\x12\x14\n\x07gn_args\x18\x0f \x01(\tH\x0e\x88\x01\x01\x12\x15\n\x08platform\x18\x10 \x01(\tH\x0f\x88\x01\x01\x12\x18\n\x0bplatform_id\x18\x11 \x01(\tH\x10\x88\x01\x01\x42\x11\n\x0f_crash_revisionB\x10\n\x0e_absolute_pathB\x16\n\x14_minimized_argumentsB\x13\n\x11_crash_stacktraceB\x11\n\x0f_crash_info_setB\x0c\n\n_http_flagB\r\n\x0b_crash_typeB\x10\n\x0e_crash_addressB\x0e\n\x0c_crash_stateB\x10\n\x0e_security_flagB\x14\n\x12_security_severityB\x18\n\x16_one_time_crasher_flagB\x0c\n\n_build_keyB\x0c\n\n_build_urlB\n\n\x08_gn_argsB\x0b\n\t_platformB\x0e\n\x0c_platform_id\"\xd1\x02\n\tCrashInfo\x12\x13\n\x06is_new\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x17\n\ncrash_type\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rsecurity_flag\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x07 \x01(\tH\x05\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x08 \x01(\tH\x06\x88\x01\x01\x12\x16\n\tunit_path\x18\t \x01(\tH\x07\x88\x01\x01\x42\t\n\x07_is_newB\x08\n\x06_countB\r\n\x0b_crash_typeB\x0e\n\x0c_crash_stateB\x10\n\x0e_security_flagB\x10\n\x0e_crash_addressB\x13\n\x11_crash_stacktraceB\x0c\n\n_unit_path\"\xcb\x01\n\x1bStoreFuzzerRunResultsOutput\x12\x1f\n\x12\x66uzzer_return_code\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12&\n\x19generated_testcase_string\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1b\n\x0e\x63onsole_output\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x15\n\x13_fuzzer_return_codeB\x1c\n\x1a_generated_testcase_stringB\x11\n\x0f_console_output\"\xc8\x07\n\rFuzzTaskCrash\x12\x16\n\tfile_path\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ncrash_time\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0breturn_code\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x15\n\rresource_list\x18\x04 \x03(\t\x12\x10\n\x08gestures\x18\x05 \x03(\t\x12\x16\n\targuments\x18\x06 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\x12\x66uzzing_strategies\x18\x07 \x03(\t\x12\x1a\n\rsecurity_flag\x18\x08 \x01(\x08H\x04\x88\x01\x01\x12\x1e\n\x11should_be_ignored\x18\t \x01(\x08H\x05\x88\x01\x01\x12\x16\n\thttp_flag\x18\n \x01(\x08H\x06\x88\x01\x01\x12%\n\x18\x61pplication_command_line\x18\x0b \x01(\tH\x07\x88\x01\x01\x12*\n\x1dunsymbolized_crash_stacktrace\x18\x0c \x01(\tH\x08\x88\x01\x01\x12\x17\n\ncrash_type\x18\r \x01(\tH\t\x88\x01\x01\x12\x1a\n\rcrash_address\x18\x0e \x01(\tH\n\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x0f \x01(\tH\x0b\x88\x01\x01\x12\x1d\n\x10\x63rash_stacktrace\x18\x10 \x01(\tH\x0c\x88\x01\x01\x12\x18\n\x10\x63rash_categories\x18\x11 \x03(\t\x12\x10\n\x03key\x18\x12 \x01(\tH\r\x88\x01\x01\x12\x15\n\x08is_valid\x18\x14 \x01(\x08H\x0e\x88\x01\x01\x12\x17\n\nfuzzed_key\x18\x15 \x01(\tH\x0f\x88\x01\x01\x12\x1a\n\rabsolute_path\x18\x16 \x01(\tH\x10\x88\x01\x01\x12\x1d\n\x10\x61rchive_filename\x18\x17 \x01(\tH\x11\x88\x01\x01\x12\x15\n\x08\x61rchived\x18\x18 \x01(\x08H\x12\x88\x01\x01\x42\x0c\n\n_file_pathB\r\n\x0b_crash_timeB\x0e\n\x0c_return_codeB\x0c\n\n_argumentsB\x10\n\x0e_security_flagB\x14\n\x12_should_be_ignoredB\x0c\n\n_http_flagB\x1b\n\x19_application_command_lineB \n\x1e_unsymbolized_crash_stacktraceB\r\n\x0b_crash_typeB\x10\n\x0e_crash_addressB\x0e\n\x0c_crash_stateB\x13\n\x11_crash_stacktraceB\x06\n\x04_keyB\x0b\n\t_is_validB\r\n\x0b_fuzzed_keyB\x10\n\x0e_absolute_pathB\x13\n\x11_archive_filenameB\x0b\n\t_archived\"\xf1\x02\n\x0b\x46uzzContext\x12\x14\n\x07redzone\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x1a\n\rdisable_ubsan\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x1c\n\x0fwindow_argument\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1f\n\x12timeout_multiplier\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x19\n\x0ctest_timeout\x18\x05 \x01(\x05H\x04\x88\x01\x01\x12\x45\n\x0f\x66uzzer_metadata\x18\x06 \x03(\x0b\x32,.uworker_msg.FuzzContext.FuzzerMetadataEntry\x1a\x35\n\x13\x46uzzerMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\n\n\x08_redzoneB\x10\n\x0e_disable_ubsanB\x12\n\x10_window_argumentB\x15\n\x13_timeout_multiplierB\x0f\n\r_test_timeout\"\xff\x01\n\x12\x46uzzTaskCrashGroup\x12.\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x18.uworker_msg.FuzzContextH\x00\x88\x01\x01\x12+\n\x07\x63rashes\x18\x02 \x03(\x0b\x32\x1a.uworker_msg.FuzzTaskCrash\x12\x33\n\nmain_crash\x18\x03 \x01(\x0b\x32\x1a.uworker_msg.FuzzTaskCrashH\x01\x88\x01\x01\x12\"\n\x15one_time_crasher_flag\x18\x04 \x01(\x08H\x02\x88\x01\x01\x42\n\n\x08_contextB\r\n\x0b_main_crashB\x18\n\x16_one_time_crasher_flag\"\xae\x01\n\x0f\x46uzzerRunOutput\x12\x13\n\x06output\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x18\n\x0breturn_code\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12-\n\ttimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\x08testcase\x18\x04 \x01(\x0cH\x02\x88\x01\x01\x42\t\n\x07_outputB\x0e\n\x0c_return_codeB\x0b\n\t_testcase\"\x94\t\n\x0e\x46uzzTaskOutput\x12(\n\x1b\x66ully_qualified_fuzzer_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1e\n\x11job_run_timestamp\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1f\n\x12testcases_executed\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12I\n\x12\x66uzzer_run_results\x18\x08 \x01(\x0b\x32(.uworker_msg.StoreFuzzerRunResultsOutputH\x04\x88\x01\x01\x12\x1e\n\x11new_targets_count\x18\t \x01(\x05H\x05\x88\x01\x01\x12\x1c\n\x0f\x66uzzer_revision\x18\n \x01(\x05H\x06\x88\x01\x01\x12\x14\n\x0c\x66uzz_targets\x18\x0b \x03(\t\x12\x1a\n\x12testcase_run_jsons\x18\x0c \x03(\t\x12\x35\n\x0c\x63rash_groups\x18\r \x03(\x0b\x32\x1f.uworker_msg.FuzzTaskCrashGroup\x12/\n\nbuild_data\x18\x0e \x01(\x0b\x32\x16.uworker_msg.BuildDataH\x07\x88\x01\x01\x12\x19\n\x0c\x61pp_revision\x18\x0f \x01(\x03H\x08\x88\x01\x01\x12\x38\n\x12\x66uzzer_run_outputs\x18\x10 \x03(\x0b\x32\x1c.uworker_msg.FuzzerRunOutput\x12\x16\n\tbuild_key\x18\x11 \x01(\tH\t\x88\x01\x01\x12\x16\n\tbuild_url\x18\x12 \x01(\tH\n\x88\x01\x01\x12\x14\n\x07gn_args\x18\x13 \x01(\tH\x0b\x88\x01\x01\x12 \n\x13testcases_generated\x18\x14 \x01(\x03H\x0c\x88\x01\x01\x12\x44\n\x1ctestcase_generation_duration\x18\x15 \x01(\x0b\x32\x19.google.protobuf.DurationH\r\x88\x01\x01\x12\x43\n\x1btestcase_execution_duration\x18\x16 \x01(\x0b\x32\x19.google.protobuf.DurationH\x0e\x88\x01\x01\x12\x38\n\x10\x66uzzing_duration\x18\x17 \x01(\x0b\x32\x19.google.protobuf.DurationH\x0f\x88\x01\x01\x42\x1e\n\x1c_fully_qualified_fuzzer_nameB\x11\n\x0f_crash_revisionB\x14\n\x12_job_run_timestampB\x15\n\x13_testcases_executedB\x15\n\x13_fuzzer_run_resultsB\x14\n\x12_new_targets_countB\x12\n\x10_fuzzer_revisionB\r\n\x0b_build_dataB\x0f\n\r_app_revisionB\x0c\n\n_build_keyB\x0c\n\n_build_urlB\n\n\x08_gn_argsB\x16\n\x14_testcases_generatedB\x1f\n\x1d_testcase_generation_durationB\x1e\n\x1c_testcase_execution_durationB\x13\n\x11_fuzzing_duration\"\xef\x05\n\x12MinimizeTaskOutput\x12X\n\x16last_crash_result_dict\x18\x01 \x03(\x0b\x32\x38.uworker_msg.MinimizeTaskOutput.LastCrashResultDictEntry\x12\x18\n\x0b\x66laky_stack\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12&\n\x19security_severity_updated\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x1e\n\x11security_severity\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1f\n\x12minimization_phase\x18\x05 \x01(\x05H\x03\x88\x01\x01\x12\x10\n\x08gestures\x18\x06 \x03(\t\x12\x1b\n\x0eminimized_keys\x18\x07 \x01(\tH\x04\x88\x01\x01\x12 \n\x13minimized_arguments\x18\x08 \x01(\tH\x05\x88\x01\x01\x12\x1a\n\rarchive_state\x18\t \x01(\x05H\x06\x88\x01\x01\x12\x1a\n\rabsolute_path\x18\n \x01(\tH\x07\x88\x01\x01\x12S\n\x13memory_tool_options\x18\x0b \x03(\x0b\x32\x36.uworker_msg.MinimizeTaskOutput.MemoryToolOptionsEntry\x1a:\n\x18LastCrashResultDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x38\n\x16MemoryToolOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0e\n\x0c_flaky_stackB\x1c\n\x1a_security_severity_updatedB\x14\n\x12_security_severityB\x15\n\x13_minimization_phaseB\x11\n\x0f_minimized_keysB\x16\n\x14_minimized_argumentsB\x10\n\x0e_archive_stateB\x10\n\x0e_absolute_path\"\xfb\x02\n\x14RegressionTaskOutput\x12#\n\x16regression_range_start\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12!\n\x14regression_range_end\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12 \n\x13last_regression_min\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12 \n\x13last_regression_max\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12/\n\x0f\x62uild_data_list\x18\x05 \x03(\x0b\x32\x16.uworker_msg.BuildData\x12%\n\x18is_testcase_reproducible\x18\x06 \x01(\x08H\x04\x88\x01\x01\x42\x19\n\x17_regression_range_startB\x17\n\x15_regression_range_endB\x16\n\x14_last_regression_minB\x16\n\x14_last_regression_maxB\x1b\n\x19_is_testcase_reproducible\"\xa3\x02\n\x11VariantTaskOutput\x12\x13\n\x06status\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x15\n\x08revision\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x17\n\ncrash_type\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63rash_state\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rsecurity_flag\x18\x05 \x01(\x08H\x04\x88\x01\x01\x12\x17\n\nis_similar\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x15\n\x08platform\x18\x07 \x01(\tH\x06\x88\x01\x01\x42\t\n\x07_statusB\x0b\n\t_revisionB\r\n\x0b_crash_typeB\x0e\n\x0c_crash_stateB\x10\n\x0e_security_flagB\r\n\x0b_is_similarB\x0b\n\t_platform\"\xe7\x01\n\tBuildData\x12\x15\n\x08revision\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x19\n\x0cis_bad_build\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\'\n\x1ashould_ignore_crash_result\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12%\n\x18\x62uild_run_console_output\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0b\n\t_revisionB\x0f\n\r_is_bad_buildB\x1d\n\x1b_should_ignore_crash_resultB\x1b\n\x19_build_run_console_output\"\xc8\x04\n\x15ProgressionTaskOutput\x12\x19\n\x0cmin_revision\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x19\n\x0cmax_revision\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x1c\n\x0f\x63rash_on_latest\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12$\n\x17\x63rash_on_latest_message\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x05 \x01(\x03H\x04\x88\x01\x01\x12)\n\x1clast_tested_crash_stacktrace\x18\x06 \x01(\tH\x05\x88\x01\x01\x12!\n\x14last_progression_min\x18\x07 \x01(\x03H\x06\x88\x01\x01\x12!\n\x14last_progression_max\x18\x08 \x01(\x03H\x07\x88\x01\x01\x12#\n\x16\x63lear_min_max_metadata\x18\t \x01(\x08H\x08\x88\x01\x01\x12/\n\x0f\x62uild_data_list\x18\x0b \x03(\x0b\x32\x16.uworker_msg.BuildDataB\x0f\n\r_min_revisionB\x0f\n\r_max_revisionB\x12\n\x10_crash_on_latestB\x1a\n\x18_crash_on_latest_messageB\x11\n\x0f_crash_revisionB\x1f\n\x1d_last_tested_crash_stacktraceB\x17\n\x15_last_progression_minB\x17\n\x15_last_progression_maxB\x19\n\x17_clear_min_max_metadata\"\xc6\x03\n\x1a\x43rossPollinationStatistics\x12#\n\x16project_qualified_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07sources\x18\x02 \x01(\tH\x01\x88\x01\x01\x12 \n\x13initial_corpus_size\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12\x18\n\x0b\x63orpus_size\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12\"\n\x15initial_edge_coverage\x18\x05 \x01(\x03H\x04\x88\x01\x01\x12\x1a\n\redge_coverage\x18\x06 \x01(\x03H\x05\x88\x01\x01\x12%\n\x18initial_feature_coverage\x18\x07 \x01(\x03H\x06\x88\x01\x01\x12\x1d\n\x10\x66\x65\x61ture_coverage\x18\x08 \x01(\x03H\x07\x88\x01\x01\x42\x19\n\x17_project_qualified_nameB\n\n\x08_sourcesB\x16\n\x14_initial_corpus_sizeB\x0e\n\x0c_corpus_sizeB\x18\n\x16_initial_edge_coverageB\x10\n\x0e_edge_coverageB\x1b\n\x19_initial_feature_coverageB\x13\n\x11_feature_coverage\"\x97\x04\n\x13\x43overageInformation\x12\x19\n\x0cproject_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x32\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x12\x1e\n\x11\x63orpus_size_units\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12\x1e\n\x11\x63orpus_size_bytes\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12\x1c\n\x0f\x63orpus_location\x18\x05 \x01(\tH\x04\x88\x01\x01\x12#\n\x16\x63orpus_backup_location\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\"\n\x15quarantine_size_units\x18\x07 \x01(\x03H\x06\x88\x01\x01\x12\"\n\x15quarantine_size_bytes\x18\x08 \x01(\x03H\x07\x88\x01\x01\x12 \n\x13quarantine_location\x18\t \x01(\tH\x08\x88\x01\x01\x42\x0f\n\r_project_nameB\x0c\n\n_timestampB\x14\n\x12_corpus_size_unitsB\x14\n\x12_corpus_size_bytesB\x12\n\x10_corpus_locationB\x19\n\x17_corpus_backup_locationB\x18\n\x16_quarantine_size_unitsB\x18\n\x16_quarantine_size_bytesB\x16\n\x14_quarantine_location\"\xa5\x03\n\x17\x43orpusPruningTaskOutput\x12M\n\x17\x63ross_pollination_stats\x18\x01 \x01(\x0b\x32\'.uworker_msg.CrossPollinationStatisticsH\x00\x88\x01\x01\x12<\n\rcoverage_info\x18\x02 \x01(\x0b\x32 .uworker_msg.CoverageInformationH\x01\x88\x01\x01\x12\x1f\n\x12\x66uzzer_binary_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0e\x63rash_revision\x18\x04 \x01(\x03H\x03\x88\x01\x01\x12\'\n\x07\x63rashes\x18\x05 \x03(\x0b\x32\x16.uworker_msg.CrashInfo\x12#\n\x16\x63orpus_backup_uploaded\x18\x06 \x01(\x08H\x04\x88\x01\x01\x42\x1a\n\x18_cross_pollination_statsB\x10\n\x0e_coverage_infoB\x15\n\x13_fuzzer_binary_nameB\x11\n\x0f_crash_revisionB\x19\n\x17_corpus_backup_uploaded\"\xc5\t\n\x06Output\x12/\n\nerror_type\x18\x03 \x01(\x0e\x32\x16.uworker_msg.ErrorTypeH\x00\x88\x01\x01\x12.\n\ruworker_input\x18\x04 \x01(\x0b\x32\x12.uworker_msg.InputH\x01\x88\x01\x01\x12\x19\n\x0ctest_timeout\x18\x05 \x01(\x02H\x02\x88\x01\x01\x12\x17\n\ncrash_time\x18\x06 \x01(\x02H\x03\x88\x01\x01\x12$\n\x17\x63rash_stacktrace_output\x18\x07 \x01(\tH\x04\x88\x01\x01\x12\x15\n\x08\x62ot_name\x18\x12 \x01(\tH\x05\x88\x01\x01\x12\x18\n\x0bplatform_id\x18\x13 \x01(\tH\x06\x88\x01\x01\x12@\n\x13\x61nalyze_task_output\x18\x08 \x01(\x0b\x32\x1e.uworker_msg.AnalyzeTaskOutputH\x07\x88\x01\x01\x12:\n\x10\x66uzz_task_output\x18\t \x01(\x0b\x32\x1b.uworker_msg.FuzzTaskOutputH\x08\x88\x01\x01\x12\x42\n\x14minimize_task_output\x18\n \x01(\x0b\x32\x1f.uworker_msg.MinimizeTaskOutputH\t\x88\x01\x01\x12\x46\n\x16regression_task_output\x18\x0b \x01(\x0b\x32!.uworker_msg.RegressionTaskOutputH\n\x88\x01\x01\x12H\n\x17progression_task_output\x18\x0c \x01(\x0b\x32\".uworker_msg.ProgressionTaskOutputH\x0b\x88\x01\x01\x12\x44\n\x15symbolize_task_output\x18\r \x01(\x0b\x32 .uworker_msg.SymbolizeTaskOutputH\x0c\x88\x01\x01\x12@\n\x13variant_task_output\x18\x0e \x01(\x0b\x32\x1e.uworker_msg.VariantTaskOutputH\r\x88\x01\x01\x12M\n\x1a\x63orpus_pruning_task_output\x18\x10 \x01(\x0b\x32$.uworker_msg.CorpusPruningTaskOutputH\x0e\x88\x01\x01\x12\x1b\n\x0eissue_metadata\x18\x14 \x01(\tH\x0f\x88\x01\x01\x12\x1a\n\rerror_message\x18\x0f \x01(\tH\x10\x88\x01\x01\x42\r\n\x0b_error_typeB\x10\n\x0e_uworker_inputB\x0f\n\r_test_timeoutB\r\n\x0b_crash_timeB\x1a\n\x18_crash_stacktrace_outputB\x0b\n\t_bot_nameB\x0e\n\x0c_platform_idB\x16\n\x14_analyze_task_outputB\x13\n\x11_fuzz_task_outputB\x17\n\x15_minimize_task_outputB\x19\n\x17_regression_task_outputB\x1a\n\x18_progression_task_outputB\x18\n\x16_symbolize_task_outputB\x16\n\x14_variant_task_outputB\x1d\n\x1b_corpus_pruning_task_outputB\x11\n\x0f_issue_metadataB\x10\n\x0e_error_message*\x95\t\n\tErrorType\x12\x0c\n\x08NO_ERROR\x10\x00\x12\x17\n\x13\x41NALYZE_BUILD_SETUP\x10\x01\x12\x14\n\x10\x41NALYZE_NO_CRASH\x10\x02\x12\x1d\n\x19\x41NALYZE_NO_REVISIONS_LIST\x10\x03\x12\x1d\n\x19\x41NALYZE_NO_REVISION_INDEX\x10\x04\x12\x12\n\x0eTESTCASE_SETUP\x10\x05\x12\r\n\tUNHANDLED\x10\x06\x12\x17\n\x13VARIANT_BUILD_SETUP\x10\x07\x12\x12\n\x0eMINIMIZE_SETUP\x10\x08\x12\x1c\n\x18\x46UZZ_BUILD_SETUP_FAILURE\x10\t\x12\"\n\x1e\x46UZZ_DATA_BUNDLE_SETUP_FAILURE\x10\n\x12\x12\n\x0e\x46UZZ_NO_FUZZER\x10\x0b\x12 \n\x1c\x46UZZ_NO_FUZZ_TARGET_SELECTED\x10\r\x12#\n\x1fPROGRESSION_REVISION_LIST_ERROR\x10\x0e\x12\x1f\n\x1bPROGRESSION_BUILD_NOT_FOUND\x10\x0f\x12\x18\n\x14PROGRESSION_NO_CRASH\x10\x10\x12!\n\x1dPROGRESSION_BAD_STATE_MIN_MAX\x10\x11\x12\x17\n\x13PROGRESSION_TIMEOUT\x10\x12\x12\x19\n\x15PROGRESSION_BAD_BUILD\x10\x13\x12!\n\x1dPROGRESSION_BUILD_SETUP_ERROR\x10\x14\x12\"\n\x1eREGRESSION_REVISION_LIST_ERROR\x10\x15\x12\x1e\n\x1aREGRESSION_BUILD_NOT_FOUND\x10\x16\x12 \n\x1cREGRESSION_BUILD_SETUP_ERROR\x10\x17\x12\x1e\n\x1aREGRESSION_BAD_BUILD_ERROR\x10\x18\x12\x17\n\x13REGRESSION_NO_CRASH\x10\x19\x12\x1c\n\x18REGRESSION_TIMEOUT_ERROR\x10\x1a\x12\x31\n-REGRESSION_LOW_CONFIDENCE_IN_REGRESSION_RANGE\x10\x1b\x12\x1f\n\x1bSYMBOLIZE_BUILD_SETUP_ERROR\x10\x1c\x12!\n\x1dMINIMIZE_UNREPRODUCIBLE_CRASH\x10\x1d\x12\x1c\n\x18MINIMIZE_CRASH_TOO_FLAKY\x10\x1e\x12\x1e\n\x1aMINIMIZE_DEADLINE_EXCEEDED\x10\x1f\x12\x31\n-MINIMIZE_DEADLINE_EXCEEDED_IN_MAIN_FILE_PHASE\x10 \x12)\n%LIBFUZZER_MINIMIZATION_UNREPRODUCIBLE\x10!\x12!\n\x1dLIBFUZZER_MINIMIZATION_FAILED\x10\"\x12&\n\"CORPUS_PRUNING_FUZZER_SETUP_FAILED\x10#\x12\x18\n\x14\x43ORPUS_PRUNING_ERROR\x10$\x12\x12\n\x0e\x46UZZ_BAD_BUILD\x10%\x12\"\n\x1e\x41NALYZE_CLOSE_INVALID_UPLOADED\x10&b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -48,8 +48,8 @@ _globals['_MINIMIZETASKOUTPUT_LASTCRASHRESULTDICTENTRY']._serialized_options = b'8\001' _globals['_MINIMIZETASKOUTPUT_MEMORYTOOLOPTIONSENTRY']._options = None _globals['_MINIMIZETASKOUTPUT_MEMORYTOOLOPTIONSENTRY']._serialized_options = b'8\001' - _globals['_ERRORTYPE']._serialized_start=14600 - _globals['_ERRORTYPE']._serialized_end=15773 + _globals['_ERRORTYPE']._serialized_start=14686 + _globals['_ERRORTYPE']._serialized_end=15859 _globals['_SETUPINPUT']._serialized_start=156 _globals['_SETUPINPUT']._serialized_end=545 _globals['_ANALYZETASKINPUT']._serialized_start=547 @@ -79,51 +79,51 @@ _globals['_CORPUSPRUNINGTASKINPUT']._serialized_start=2819 _globals['_CORPUSPRUNINGTASKINPUT']._serialized_end=3516 _globals['_INPUT']._serialized_start=3519 - _globals['_INPUT']._serialized_end=5010 - _globals['_INPUT_UWORKERENVENTRY']._serialized_start=4572 - _globals['_INPUT_UWORKERENVENTRY']._serialized_end=4621 - _globals['_VARIANTTASKINPUT']._serialized_start=5012 - _globals['_VARIANTTASKINPUT']._serialized_end=5084 - _globals['_SYMBOLIZETASKOUTPUT']._serialized_start=5087 - _globals['_SYMBOLIZETASKOUTPUT']._serialized_end=5414 - _globals['_ANALYZETASKOUTPUT']._serialized_start=5417 - _globals['_ANALYZETASKOUTPUT']._serialized_end=6204 - _globals['_CRASHINFO']._serialized_start=6207 - _globals['_CRASHINFO']._serialized_end=6544 - _globals['_STOREFUZZERRUNRESULTSOUTPUT']._serialized_start=6547 - _globals['_STOREFUZZERRUNRESULTSOUTPUT']._serialized_end=6750 - _globals['_FUZZTASKCRASH']._serialized_start=6753 - _globals['_FUZZTASKCRASH']._serialized_end=7721 - _globals['_FUZZCONTEXT']._serialized_start=7724 - _globals['_FUZZCONTEXT']._serialized_end=8093 - _globals['_FUZZCONTEXT_FUZZERMETADATAENTRY']._serialized_start=7950 - _globals['_FUZZCONTEXT_FUZZERMETADATAENTRY']._serialized_end=8003 - _globals['_FUZZTASKCRASHGROUP']._serialized_start=8096 - _globals['_FUZZTASKCRASHGROUP']._serialized_end=8351 - _globals['_FUZZERRUNOUTPUT']._serialized_start=8354 - _globals['_FUZZERRUNOUTPUT']._serialized_end=8528 - _globals['_FUZZTASKOUTPUT']._serialized_start=8531 - _globals['_FUZZTASKOUTPUT']._serialized_end=9703 - _globals['_MINIMIZETASKOUTPUT']._serialized_start=9706 - _globals['_MINIMIZETASKOUTPUT']._serialized_end=10457 - _globals['_MINIMIZETASKOUTPUT_LASTCRASHRESULTDICTENTRY']._serialized_start=10171 - _globals['_MINIMIZETASKOUTPUT_LASTCRASHRESULTDICTENTRY']._serialized_end=10229 - _globals['_MINIMIZETASKOUTPUT_MEMORYTOOLOPTIONSENTRY']._serialized_start=10231 - _globals['_MINIMIZETASKOUTPUT_MEMORYTOOLOPTIONSENTRY']._serialized_end=10287 - _globals['_REGRESSIONTASKOUTPUT']._serialized_start=10460 - _globals['_REGRESSIONTASKOUTPUT']._serialized_end=10839 - _globals['_VARIANTTASKOUTPUT']._serialized_start=10842 - _globals['_VARIANTTASKOUTPUT']._serialized_end=11133 - _globals['_BUILDDATA']._serialized_start=11136 - _globals['_BUILDDATA']._serialized_end=11367 - _globals['_PROGRESSIONTASKOUTPUT']._serialized_start=11370 - _globals['_PROGRESSIONTASKOUTPUT']._serialized_end=11954 - _globals['_CROSSPOLLINATIONSTATISTICS']._serialized_start=11957 - _globals['_CROSSPOLLINATIONSTATISTICS']._serialized_end=12411 - _globals['_COVERAGEINFORMATION']._serialized_start=12414 - _globals['_COVERAGEINFORMATION']._serialized_end=12949 - _globals['_CORPUSPRUNINGTASKOUTPUT']._serialized_start=12952 - _globals['_CORPUSPRUNINGTASKOUTPUT']._serialized_end=13373 - _globals['_OUTPUT']._serialized_start=13376 - _globals['_OUTPUT']._serialized_end=14597 + _globals['_INPUT']._serialized_end=5096 + _globals['_INPUT_UWORKERENVENTRY']._serialized_start=4634 + _globals['_INPUT_UWORKERENVENTRY']._serialized_end=4683 + _globals['_VARIANTTASKINPUT']._serialized_start=5098 + _globals['_VARIANTTASKINPUT']._serialized_end=5170 + _globals['_SYMBOLIZETASKOUTPUT']._serialized_start=5173 + _globals['_SYMBOLIZETASKOUTPUT']._serialized_end=5500 + _globals['_ANALYZETASKOUTPUT']._serialized_start=5503 + _globals['_ANALYZETASKOUTPUT']._serialized_end=6290 + _globals['_CRASHINFO']._serialized_start=6293 + _globals['_CRASHINFO']._serialized_end=6630 + _globals['_STOREFUZZERRUNRESULTSOUTPUT']._serialized_start=6633 + _globals['_STOREFUZZERRUNRESULTSOUTPUT']._serialized_end=6836 + _globals['_FUZZTASKCRASH']._serialized_start=6839 + _globals['_FUZZTASKCRASH']._serialized_end=7807 + _globals['_FUZZCONTEXT']._serialized_start=7810 + _globals['_FUZZCONTEXT']._serialized_end=8179 + _globals['_FUZZCONTEXT_FUZZERMETADATAENTRY']._serialized_start=8036 + _globals['_FUZZCONTEXT_FUZZERMETADATAENTRY']._serialized_end=8089 + _globals['_FUZZTASKCRASHGROUP']._serialized_start=8182 + _globals['_FUZZTASKCRASHGROUP']._serialized_end=8437 + _globals['_FUZZERRUNOUTPUT']._serialized_start=8440 + _globals['_FUZZERRUNOUTPUT']._serialized_end=8614 + _globals['_FUZZTASKOUTPUT']._serialized_start=8617 + _globals['_FUZZTASKOUTPUT']._serialized_end=9789 + _globals['_MINIMIZETASKOUTPUT']._serialized_start=9792 + _globals['_MINIMIZETASKOUTPUT']._serialized_end=10543 + _globals['_MINIMIZETASKOUTPUT_LASTCRASHRESULTDICTENTRY']._serialized_start=10257 + _globals['_MINIMIZETASKOUTPUT_LASTCRASHRESULTDICTENTRY']._serialized_end=10315 + _globals['_MINIMIZETASKOUTPUT_MEMORYTOOLOPTIONSENTRY']._serialized_start=10317 + _globals['_MINIMIZETASKOUTPUT_MEMORYTOOLOPTIONSENTRY']._serialized_end=10373 + _globals['_REGRESSIONTASKOUTPUT']._serialized_start=10546 + _globals['_REGRESSIONTASKOUTPUT']._serialized_end=10925 + _globals['_VARIANTTASKOUTPUT']._serialized_start=10928 + _globals['_VARIANTTASKOUTPUT']._serialized_end=11219 + _globals['_BUILDDATA']._serialized_start=11222 + _globals['_BUILDDATA']._serialized_end=11453 + _globals['_PROGRESSIONTASKOUTPUT']._serialized_start=11456 + _globals['_PROGRESSIONTASKOUTPUT']._serialized_end=12040 + _globals['_CROSSPOLLINATIONSTATISTICS']._serialized_start=12043 + _globals['_CROSSPOLLINATIONSTATISTICS']._serialized_end=12497 + _globals['_COVERAGEINFORMATION']._serialized_start=12500 + _globals['_COVERAGEINFORMATION']._serialized_end=13035 + _globals['_CORPUSPRUNINGTASKOUTPUT']._serialized_start=13038 + _globals['_CORPUSPRUNINGTASKOUTPUT']._serialized_end=13459 + _globals['_OUTPUT']._serialized_start=13462 + _globals['_OUTPUT']._serialized_end=14683 # @@protoc_insertion_point(module_scope) diff --git a/src/clusterfuzz/_internal/protos/uworker_msg_pb2.pyi b/src/clusterfuzz/_internal/protos/uworker_msg_pb2.pyi index e9872d228e..e03f125154 100644 --- a/src/clusterfuzz/_internal/protos/uworker_msg_pb2.pyi +++ b/src/clusterfuzz/_internal/protos/uworker_msg_pb2.pyi @@ -636,6 +636,7 @@ class Input(google.protobuf.message.Message): PREPROCESS_START_TIME_FIELD_NUMBER: builtins.int GLOBAL_BLACKLISTED_FUNCTIONS_FIELD_NUMBER: builtins.int FUZZ_TARGET_FIELD_NUMBER: builtins.int + PREPROCESS_END_TIME_FIELD_NUMBER: builtins.int @property def testcase(self) -> google.protobuf.any_pb2.Any: ... @property @@ -672,6 +673,8 @@ class Input(google.protobuf.message.Message): def global_blacklisted_functions(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ... @property def fuzz_target(self) -> google.protobuf.any_pb2.Any: ... + @property + def preprocess_end_time(self) -> google.protobuf.timestamp_pb2.Timestamp: ... def __init__( self, *, @@ -695,9 +698,10 @@ class Input(google.protobuf.message.Message): preprocess_start_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., global_blacklisted_functions: collections.abc.Iterable[builtins.str] | None = ..., fuzz_target: google.protobuf.any_pb2.Any | None = ..., + preprocess_end_time: google.protobuf.timestamp_pb2.Timestamp | None = ..., ) -> None: ... - def HasField(self, field_name: typing_extensions.Literal["_analyze_task_input", b"_analyze_task_input", "_corpus_pruning_task_input", b"_corpus_pruning_task_input", "_fuzz_target", b"_fuzz_target", "_fuzz_task_input", b"_fuzz_task_input", "_fuzzer_name", b"_fuzzer_name", "_job_type", b"_job_type", "_minimize_task_input", b"_minimize_task_input", "_module_name", b"_module_name", "_preprocess_start_time", b"_preprocess_start_time", "_progression_task_input", b"_progression_task_input", "_regression_task_input", b"_regression_task_input", "_setup_input", b"_setup_input", "_symbolize_task_input", b"_symbolize_task_input", "_testcase", b"_testcase", "_testcase_id", b"_testcase_id", "_testcase_upload_metadata", b"_testcase_upload_metadata", "_uworker_output_upload_url", b"_uworker_output_upload_url", "_variant_task_input", b"_variant_task_input", "analyze_task_input", b"analyze_task_input", "corpus_pruning_task_input", b"corpus_pruning_task_input", "fuzz_target", b"fuzz_target", "fuzz_task_input", b"fuzz_task_input", "fuzzer_name", b"fuzzer_name", "job_type", b"job_type", "minimize_task_input", b"minimize_task_input", "module_name", b"module_name", "preprocess_start_time", b"preprocess_start_time", "progression_task_input", b"progression_task_input", "regression_task_input", b"regression_task_input", "setup_input", b"setup_input", "symbolize_task_input", b"symbolize_task_input", "testcase", b"testcase", "testcase_id", b"testcase_id", "testcase_upload_metadata", b"testcase_upload_metadata", "uworker_output_upload_url", b"uworker_output_upload_url", "variant_task_input", b"variant_task_input"]) -> builtins.bool: ... - def ClearField(self, field_name: typing_extensions.Literal["_analyze_task_input", b"_analyze_task_input", "_corpus_pruning_task_input", b"_corpus_pruning_task_input", "_fuzz_target", b"_fuzz_target", "_fuzz_task_input", b"_fuzz_task_input", "_fuzzer_name", b"_fuzzer_name", "_job_type", b"_job_type", "_minimize_task_input", b"_minimize_task_input", "_module_name", b"_module_name", "_preprocess_start_time", b"_preprocess_start_time", "_progression_task_input", b"_progression_task_input", "_regression_task_input", b"_regression_task_input", "_setup_input", b"_setup_input", "_symbolize_task_input", b"_symbolize_task_input", "_testcase", b"_testcase", "_testcase_id", b"_testcase_id", "_testcase_upload_metadata", b"_testcase_upload_metadata", "_uworker_output_upload_url", b"_uworker_output_upload_url", "_variant_task_input", b"_variant_task_input", "analyze_task_input", b"analyze_task_input", "corpus_pruning_task_input", b"corpus_pruning_task_input", "fuzz_target", b"fuzz_target", "fuzz_task_input", b"fuzz_task_input", "fuzzer_name", b"fuzzer_name", "global_blacklisted_functions", b"global_blacklisted_functions", "job_type", b"job_type", "minimize_task_input", b"minimize_task_input", "module_name", b"module_name", "preprocess_start_time", b"preprocess_start_time", "progression_task_input", b"progression_task_input", "regression_task_input", b"regression_task_input", "setup_input", b"setup_input", "symbolize_task_input", b"symbolize_task_input", "testcase", b"testcase", "testcase_id", b"testcase_id", "testcase_upload_metadata", b"testcase_upload_metadata", "uworker_env", b"uworker_env", "uworker_output_upload_url", b"uworker_output_upload_url", "variant_task_input", b"variant_task_input"]) -> None: ... + def HasField(self, field_name: typing_extensions.Literal["_analyze_task_input", b"_analyze_task_input", "_corpus_pruning_task_input", b"_corpus_pruning_task_input", "_fuzz_target", b"_fuzz_target", "_fuzz_task_input", b"_fuzz_task_input", "_fuzzer_name", b"_fuzzer_name", "_job_type", b"_job_type", "_minimize_task_input", b"_minimize_task_input", "_module_name", b"_module_name", "_preprocess_end_time", b"_preprocess_end_time", "_preprocess_start_time", b"_preprocess_start_time", "_progression_task_input", b"_progression_task_input", "_regression_task_input", b"_regression_task_input", "_setup_input", b"_setup_input", "_symbolize_task_input", b"_symbolize_task_input", "_testcase", b"_testcase", "_testcase_id", b"_testcase_id", "_testcase_upload_metadata", b"_testcase_upload_metadata", "_uworker_output_upload_url", b"_uworker_output_upload_url", "_variant_task_input", b"_variant_task_input", "analyze_task_input", b"analyze_task_input", "corpus_pruning_task_input", b"corpus_pruning_task_input", "fuzz_target", b"fuzz_target", "fuzz_task_input", b"fuzz_task_input", "fuzzer_name", b"fuzzer_name", "job_type", b"job_type", "minimize_task_input", b"minimize_task_input", "module_name", b"module_name", "preprocess_end_time", b"preprocess_end_time", "preprocess_start_time", b"preprocess_start_time", "progression_task_input", b"progression_task_input", "regression_task_input", b"regression_task_input", "setup_input", b"setup_input", "symbolize_task_input", b"symbolize_task_input", "testcase", b"testcase", "testcase_id", b"testcase_id", "testcase_upload_metadata", b"testcase_upload_metadata", "uworker_output_upload_url", b"uworker_output_upload_url", "variant_task_input", b"variant_task_input"]) -> builtins.bool: ... + def ClearField(self, field_name: typing_extensions.Literal["_analyze_task_input", b"_analyze_task_input", "_corpus_pruning_task_input", b"_corpus_pruning_task_input", "_fuzz_target", b"_fuzz_target", "_fuzz_task_input", b"_fuzz_task_input", "_fuzzer_name", b"_fuzzer_name", "_job_type", b"_job_type", "_minimize_task_input", b"_minimize_task_input", "_module_name", b"_module_name", "_preprocess_end_time", b"_preprocess_end_time", "_preprocess_start_time", b"_preprocess_start_time", "_progression_task_input", b"_progression_task_input", "_regression_task_input", b"_regression_task_input", "_setup_input", b"_setup_input", "_symbolize_task_input", b"_symbolize_task_input", "_testcase", b"_testcase", "_testcase_id", b"_testcase_id", "_testcase_upload_metadata", b"_testcase_upload_metadata", "_uworker_output_upload_url", b"_uworker_output_upload_url", "_variant_task_input", b"_variant_task_input", "analyze_task_input", b"analyze_task_input", "corpus_pruning_task_input", b"corpus_pruning_task_input", "fuzz_target", b"fuzz_target", "fuzz_task_input", b"fuzz_task_input", "fuzzer_name", b"fuzzer_name", "global_blacklisted_functions", b"global_blacklisted_functions", "job_type", b"job_type", "minimize_task_input", b"minimize_task_input", "module_name", b"module_name", "preprocess_end_time", b"preprocess_end_time", "preprocess_start_time", b"preprocess_start_time", "progression_task_input", b"progression_task_input", "regression_task_input", b"regression_task_input", "setup_input", b"setup_input", "symbolize_task_input", b"symbolize_task_input", "testcase", b"testcase", "testcase_id", b"testcase_id", "testcase_upload_metadata", b"testcase_upload_metadata", "uworker_env", b"uworker_env", "uworker_output_upload_url", b"uworker_output_upload_url", "variant_task_input", b"variant_task_input"]) -> None: ... @typing.overload def WhichOneof(self, oneof_group: typing_extensions.Literal["_analyze_task_input", b"_analyze_task_input"]) -> typing_extensions.Literal["analyze_task_input"] | None: ... @typing.overload @@ -715,6 +719,8 @@ class Input(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: typing_extensions.Literal["_module_name", b"_module_name"]) -> typing_extensions.Literal["module_name"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing_extensions.Literal["_preprocess_end_time", b"_preprocess_end_time"]) -> typing_extensions.Literal["preprocess_end_time"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing_extensions.Literal["_preprocess_start_time", b"_preprocess_start_time"]) -> typing_extensions.Literal["preprocess_start_time"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing_extensions.Literal["_progression_task_input", b"_progression_task_input"]) -> typing_extensions.Literal["progression_task_input"] | None: ... diff --git a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/utasks_test.py b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/utasks_test.py index 73dda51d27..cbb7e820b4 100644 --- a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/utasks_test.py +++ b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/utasks_test.py @@ -18,6 +18,7 @@ import time import unittest from unittest import mock +import zlib from google.protobuf import timestamp_pb2 import parameterized @@ -42,6 +43,7 @@ class TworkerPreprocessTest(unittest.TestCase): OUTPUT_SIGNED_UPLOAD_URL = 'https://signed-upload-output' OUTPUT_DOWNLOAD_GCS_URL = '/download-output' INPUT_SIGNED_DOWNLOAD_URL = 'https://signed-download-input' + INPUT_UPLOAD_GCS_URL = '/upload-input' UWORKER_ENV = {'ENVVAR': 'VALUE'} TASK_ARGUMENT = '1' # testcase_id JOB_TYPE = 'libfuzzer_asan' @@ -51,16 +53,17 @@ def setUp(self): helpers.patch_environ(self) helpers.patch(self, [ 'clusterfuzz._internal.bot.tasks.utasks._get_execution_mode', + 'clusterfuzz._internal.bot.tasks.utasks.uworker_io.get_uworker_input_urls', 'clusterfuzz._internal.bot.tasks.utasks.uworker_io.get_uworker_output_urls', - 'clusterfuzz._internal.bot.tasks.utasks.uworker_io.serialize_and_upload_uworker_input', + 'clusterfuzz._internal.google_cloud_utils.storage.write_data', 'clusterfuzz._internal.metrics.events.emit', 'clusterfuzz._internal.metrics.events._get_datetime_now', ]) self.mock._get_datetime_now.return_value = datetime.datetime(2025, 1, 1) + self.mock.get_uworker_input_urls.return_value = ( + self.INPUT_SIGNED_DOWNLOAD_URL, self.INPUT_UPLOAD_GCS_URL) self.mock.get_uworker_output_urls.return_value = ( self.OUTPUT_SIGNED_UPLOAD_URL, self.OUTPUT_DOWNLOAD_GCS_URL) - self.mock.serialize_and_upload_uworker_input.return_value = ( - self.INPUT_SIGNED_DOWNLOAD_URL, self.OUTPUT_DOWNLOAD_GCS_URL) os.environ['CF_TASK_ID'] = 'f61826c3-ca9a-4b97-9c1e-9e6f4e4f8868' os.environ['CF_TASK_NAME'] = 'mock_task' @@ -88,12 +91,18 @@ def test_tworker_preprocess(self, execution_mode: utasks.Mode): module.utask_preprocess.assert_called_with(self.TASK_ARGUMENT, self.JOB_TYPE, self.UWORKER_ENV) - self.mock.serialize_and_upload_uworker_input.assert_called_with( - uworker_input) + serial = zlib.compress(uworker_input.SerializeToString()) + self.mock.write_data.assert_called_with(serial, self.INPUT_UPLOAD_GCS_URL) self.assertGreaterEqual(uworker_input.preprocess_start_time.ToNanoseconds(), start_time_ns) self.assertLessEqual(uworker_input.preprocess_start_time.ToNanoseconds(), end_time_ns) + self.assertGreaterEqual(uworker_input.preprocess_end_time.ToNanoseconds(), + uworker_input.preprocess_start_time.ToNanoseconds()) + self.assertLessEqual(uworker_input.preprocess_end_time.ToNanoseconds(), + end_time_ns) + self.assertEqual(uworker_input.uworker_output_upload_url, + self.OUTPUT_SIGNED_UPLOAD_URL) metric_labels = { 'task': 'mock', @@ -115,6 +124,10 @@ def test_tworker_preprocess(self, execution_mode: utasks.Mode): e2e_durations.sum * 10**9, end_time_ns - uworker_input.preprocess_start_time.ToNanoseconds()) + wait_durations = monitoring_metrics.UTASK_SUBTASK_WAIT_DURATION_SECS.get( + metric_labels) + self.assertEqual(wait_durations.count, 0) + self.assertEqual( (self.INPUT_SIGNED_DOWNLOAD_URL, self.OUTPUT_DOWNLOAD_GCS_URL), result) @@ -131,6 +144,60 @@ def test_tworker_preprocess(self, execution_mode: utasks.Mode): self.assertEqual(task_event.task_id, 'f61826c3-ca9a-4b97-9c1e-9e6f4e4f8868') self.mock.emit.assert_called_once_with(task_event) + def test_no_io_preprocess_and_main(self): + """Tests that tworker_preprocess_no_io sets preprocess_end_time and + uworker_main_no_io records the wait duration metric.""" + mock_time = helpers.MockTime(10) + helpers.patch(self, ['time.time_ns']) + self.mock.time_ns.side_effect = mock_time.time_ns + + module = mock.MagicMock(__name__='mock_task') + task_utils._TESTCASE_BASED_TASKS.add('mock') + + uworker_input = uworker_msg_pb2.Input(job_type=self.JOB_TYPE) + + def preprocess(*_args): + mock_time.advance(10) + return uworker_input + + module.utask_preprocess.side_effect = preprocess + module.utask_main.return_value = uworker_msg_pb2.Output(crash_time=70.1) + + serialized_input = utasks.tworker_preprocess_no_io( + module, self.TASK_ARGUMENT, self.JOB_TYPE, self.UWORKER_ENV) + + self.assertIsNotNone(serialized_input) + self.assertEqual(uworker_input.preprocess_start_time.ToNanoseconds(), + 10 * 10**9) + self.assertEqual(uworker_input.preprocess_end_time.ToNanoseconds(), + 20 * 10**9) + + preprocess_labels = { + 'task': 'mock', + 'job': self.JOB_TYPE, + 'subtask': 'preprocess', + 'mode': utasks.Mode.QUEUE.value, + 'platform': 'LINUX', + } + self.assertEqual( + monitoring_metrics.UTASK_SUBTASK_WAIT_DURATION_SECS.get( + preprocess_labels).count, 0) + + mock_time.advance(30) + utasks.uworker_main_no_io(module, serialized_input) + + main_labels = { + 'task': 'mock', + 'job': self.JOB_TYPE, + 'subtask': 'uworker_main', + 'mode': utasks.Mode.QUEUE.value, + 'platform': 'LINUX', + } + wait_durations = monitoring_metrics.UTASK_SUBTASK_WAIT_DURATION_SECS.get( + main_labels) + self.assertEqual(wait_durations.count, 1) + self.assertEqual(wait_durations.sum, 30) + def test_return_none(self): """Tests tworker_preprocess works as expected if utask returns none.""" module = mock.MagicMock(__name__='mock_task') @@ -240,6 +307,10 @@ def test_uworker_main(self, execution_mode: utasks.Mode): preprocess_start_timestamp = timestamp_pb2.Timestamp() preprocess_start_timestamp.FromNanoseconds(preprocess_start_time_ns) + preprocess_end_time_ns = start_time_ns - 20 * 10**9 + preprocess_end_timestamp = timestamp_pb2.Timestamp() + preprocess_end_timestamp.FromNanoseconds(preprocess_end_time_ns) + uworker_input = uworker_msg_pb2.Input( job_type='job_type-value', variant_task_input=uworker_msg_pb2.VariantTaskInput( @@ -247,6 +318,7 @@ def test_uworker_main(self, execution_mode: utasks.Mode): uworker_env=self.UWORKER_ENV, uworker_output_upload_url=self.UWORKER_OUTPUT_UPLOAD_URL, preprocess_start_time=preprocess_start_timestamp, + preprocess_end_time=preprocess_end_timestamp, ) self.mock.download_and_deserialize_uworker_input.return_value = ( uworker_input) @@ -284,10 +356,62 @@ def test_uworker_main(self, execution_mode: utasks.Mode): end_time_ns - preprocess_start_time_ns) self.assertGreaterEqual(e2e_durations.sum, 42) + wait_durations = monitoring_metrics.UTASK_SUBTASK_WAIT_DURATION_SECS.get( + metric_labels) + self.assertEqual(wait_durations.count, 1) + self.assertLess(wait_durations.sum * 10**9, + end_time_ns - preprocess_end_time_ns) + self.assertGreaterEqual(wait_durations.sum, 20) + # Asserts that task events were not emitted from main (as these may cause # a permission denied error if running in a untrusted worker). self.mock.emit.assert_not_called() + def test_uworker_main_without_preprocess_end_time(self): + """Tests that uworker_main does not record wait duration when + preprocess_end_time is not set on the input (backward compatibility).""" + mock_time = helpers.MockTime(10) + helpers.patch(self, ['time.time_ns']) + self.mock.time_ns.side_effect = mock_time.time_ns + self.mock.is_running_on_swarming.return_value = False + + preprocess_start_timestamp = timestamp_pb2.Timestamp() + preprocess_start_timestamp.FromNanoseconds(mock_time.time_ns()) + mock_time.advance(42) + + uworker_input = uworker_msg_pb2.Input( + job_type='job_type-value', + uworker_env=self.UWORKER_ENV, + uworker_output_upload_url=self.UWORKER_OUTPUT_UPLOAD_URL, + preprocess_start_time=preprocess_start_timestamp, + ) + self.mock.download_and_deserialize_uworker_input.return_value = ( + uworker_input) + self.module.utask_main.return_value = uworker_msg_pb2.Output( + crash_time=70.1) + + utasks.uworker_main('http://input') + + metric_labels = { + 'task': 'analyze', + 'job': uworker_input.job_type, + 'subtask': 'uworker_main', + 'mode': utasks.Mode.BATCH.value, + 'platform': 'LINUX', + } + durations = monitoring_metrics.UTASK_SUBTASK_DURATION_SECS.get( + metric_labels) + self.assertEqual(durations.count, 1) + + e2e_durations = monitoring_metrics.UTASK_SUBTASK_E2E_DURATION_SECS.get( + metric_labels) + self.assertEqual(e2e_durations.count, 1) + self.assertEqual(e2e_durations.sum, 42) + + self.assertEqual( + monitoring_metrics.UTASK_SUBTASK_WAIT_DURATION_SECS.get(metric_labels) + .count, 0) + class GetUtaskModuleTest(unittest.TestCase): diff --git a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/uworker_io_test.py b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/uworker_io_test.py index 57ffab2aa4..ef3b3beb0f 100644 --- a/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/uworker_io_test.py +++ b/src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/uworker_io_test.py @@ -153,7 +153,8 @@ def download_signed_url(url, local_path=None): with tempfile.TemporaryDirectory() as tmp_dir: os.environ['BOT_TMPDIR'] = tmp_dir - uworker_io.serialize_and_upload_uworker_input(uworker_input) + urls = uworker_io.prepare_uworker_io_urls() + uworker_io.serialize_and_upload_uworker_input(uworker_input, urls) with mock.patch( 'clusterfuzz._internal.google_cloud_utils.storage.' 'download_signed_url', download_signed_url) as _: diff --git a/src/clusterfuzz/_internal/tests/test_libs/helpers.py b/src/clusterfuzz/_internal/tests/test_libs/helpers.py index e52eccb154..3ca0812508 100644 --- a/src/clusterfuzz/_internal/tests/test_libs/helpers.py +++ b/src/clusterfuzz/_internal/tests/test_libs/helpers.py @@ -95,3 +95,7 @@ def advance(self, delta): def time(self): """Get the current time.""" return self.current_time + + def time_ns(self): + """Get the current time in nanoseconds.""" + return int(self.current_time * 10**9)