|
13 | 13 | # limitations under the License. |
14 | 14 | """Analyze task for handling user uploads.""" |
15 | 15 |
|
16 | | -import datetime |
17 | 16 | import json |
18 | 17 | from typing import Dict |
19 | 18 | from typing import Optional |
|
28 | 27 | from clusterfuzz._internal.bot.tasks.utasks import uworker_io |
29 | 28 | from clusterfuzz._internal.build_management import build_manager |
30 | 29 | from clusterfuzz._internal.build_management import revisions |
| 30 | +from clusterfuzz._internal.common import testcase_utils |
31 | 31 | from clusterfuzz._internal.crash_analysis import crash_analyzer |
32 | 32 | from clusterfuzz._internal.crash_analysis import severity_analyzer |
33 | 33 | from clusterfuzz._internal.datastore import data_handler |
@@ -119,7 +119,7 @@ def handle_analyze_no_revision_index(output): |
119 | 119 |
|
120 | 120 | def handle_analyze_close_invalid_uploaded(output): |
121 | 121 | testcase = data_handler.get_testcase_by_id(output.uworker_input.testcase_id) |
122 | | - testcase_upload_metadata = query_testcase_upload_metadata( |
| 122 | + testcase_upload_metadata = testcase_utils.get_testcase_upload_metadata( |
123 | 123 | output.uworker_input.testcase_id) |
124 | 124 | data_handler.close_invalid_uploaded_testcase( |
125 | 125 | testcase, testcase_upload_metadata, 'Irrelevant') |
@@ -259,7 +259,7 @@ def handle_noncrash(output): |
259 | 259 | tasks.add_task('analyze', output.uworker_input.testcase_id, |
260 | 260 | output.uworker_input.job_type) |
261 | 261 | return |
262 | | - testcase_upload_metadata = query_testcase_upload_metadata( |
| 262 | + testcase_upload_metadata = testcase_utils.get_testcase_upload_metadata( |
263 | 263 | output.uworker_input.testcase_id) |
264 | 264 | data_handler.mark_invalid_uploaded_testcase( |
265 | 265 | testcase, testcase_upload_metadata, 'Unreproducible') |
@@ -299,17 +299,24 @@ def utask_preprocess(testcase_id, job_type, uworker_env): |
299 | 299 | testcase = data_handler.get_testcase_by_id(testcase_id) |
300 | 300 | data_handler.update_testcase_comment(testcase, data_types.TaskState.STARTED) |
301 | 301 |
|
302 | | - testcase_upload_metadata = query_testcase_upload_metadata(testcase_id) |
| 302 | + testcase_upload_metadata = testcase_utils.get_testcase_upload_metadata( |
| 303 | + testcase_id) |
303 | 304 | if not testcase_upload_metadata: |
304 | 305 | logs.error('Testcase %s has no associated upload metadata.' % testcase_id) |
305 | 306 | testcase.key.delete() |
306 | 307 | return None |
307 | 308 |
|
308 | 309 | # Store the bot name and timestamp in upload metadata. |
309 | 310 | testcase_upload_metadata.bot_name = environment.get_value('BOT_NAME') |
310 | | - testcase_upload_metadata.timestamp = datetime.datetime.utcnow() |
311 | 311 | testcase_upload_metadata.put() |
312 | 312 |
|
| 313 | + # Emmits a TESTCASE_TRIAGE_DURATION metric, in order to track the time |
| 314 | + # elapsed between testcase upload and pulling the task from the queue. |
| 315 | + |
| 316 | + testcase_utils.emit_testcase_triage_duration_metric( |
| 317 | + int(testcase_id), |
| 318 | + testcase_utils.TESTCASE_TRIAGE_DURATION_ANALYZE_LAUNCHED_STEP) |
| 319 | + |
313 | 320 | initialize_testcase_for_main(testcase, job_type) |
314 | 321 |
|
315 | 322 | setup_input = setup.preprocess_setup_testcase(testcase, uworker_env) |
@@ -481,7 +488,7 @@ def handle_build_setup_error(output): |
481 | 488 | output.uworker_input.job_type, |
482 | 489 | wait_time=testcase_fail_wait) |
483 | 490 | return |
484 | | - testcase_upload_metadata = query_testcase_upload_metadata( |
| 491 | + testcase_upload_metadata = testcase_utils.get_testcase_upload_metadata( |
485 | 492 | output.uworker_input.testcase_id) |
486 | 493 | data_handler.mark_invalid_uploaded_testcase( |
487 | 494 | testcase, testcase_upload_metadata, 'Build setup failed') |
@@ -552,13 +559,16 @@ def _update_testcase(output): |
552 | 559 | def utask_postprocess(output): |
553 | 560 | """Trusted: Cleans up after a uworker execute_task, writing anything needed to |
554 | 561 | the db.""" |
| 562 | + testcase = data_handler.get_testcase_by_id(output.uworker_input.testcase_id) |
| 563 | + testcase_upload_metadata = testcase_utils.get_testcase_upload_metadata( |
| 564 | + output.uworker_input.testcase_id) |
| 565 | + testcase_utils.emit_testcase_triage_duration_metric( |
| 566 | + int(output.uworker_input.testcase_id), |
| 567 | + testcase_utils.TESTCASE_TRIAGE_DURATION_ANALYZE_COMPLETED_STEP) |
555 | 568 | _update_testcase(output) |
556 | 569 | if output.error_type != uworker_msg_pb2.ErrorType.NO_ERROR: # pylint: disable=no-member |
557 | 570 | _ERROR_HANDLER.handle(output) |
558 | 571 | return |
559 | | - testcase = data_handler.get_testcase_by_id(output.uworker_input.testcase_id) |
560 | | - testcase_upload_metadata = query_testcase_upload_metadata( |
561 | | - output.uworker_input.testcase_id) |
562 | 572 |
|
563 | 573 | log_message = (f'Testcase crashed in {output.test_timeout} seconds ' |
564 | 574 | f'(r{testcase.crash_revision})') |
@@ -612,9 +622,3 @@ def utask_postprocess(output): |
612 | 622 | # 5. Get second stacktrace from another job in case of |
613 | 623 | # one-time crashes (stack). |
614 | 624 | task_creation.create_tasks(testcase) |
615 | | - |
616 | | - |
617 | | -def query_testcase_upload_metadata( |
618 | | - testcase_id: str) -> Optional[data_types.TestcaseUploadMetadata]: |
619 | | - return data_types.TestcaseUploadMetadata.query( |
620 | | - data_types.TestcaseUploadMetadata.testcase_id == int(testcase_id)).get() |
|
0 commit comments