Chromium Code Reviews| Index: appengine/findit/waterfall/try_job_util.py |
| diff --git a/appengine/findit/waterfall/try_job_util.py b/appengine/findit/waterfall/try_job_util.py |
| index eaa4209bf663a6f600d080d825e16ffdbfdb6733..fab539e4520543730f2d680db848f75ba77473d6 100644 |
| --- a/appengine/findit/waterfall/try_job_util.py |
| +++ b/appengine/findit/waterfall/try_job_util.py |
| @@ -3,6 +3,7 @@ |
| # found in the LICENSE file. |
| from datetime import datetime |
| +from datetime import timedelta |
| import logging |
| from google.appengine.ext import ndb |
| @@ -19,6 +20,9 @@ from waterfall import swarming_tasks_to_try_job_pipeline |
| from waterfall import waterfall_config |
| from waterfall.try_job_type import TryJobType |
| +# TODO(lijeffrey): Move this to config. |
| +MATCHING_GROUPS_SECONDS_AGO = 24 * 60 * 60 # 24 hours |
|
lijeffrey
2016/08/10 00:09:54
nit: comment ends with .
|
| + |
| def _CheckFailureForTryJobKey( |
| master_name, builder_name, build_number, |
| @@ -196,6 +200,7 @@ def _CreateBuildFailureGroup( |
| master_name, builder_name, build_number, build_failure_type, blame_list, |
| suspected_tuples, output_nodes=None, failed_steps_and_tests=None): |
| new_group = WfFailureGroup.Create(master_name, builder_name, build_number) |
| + new_group.created_time = datetime.utcnow() |
| new_group.build_failure_type = build_failure_type |
| new_group.blame_list = blame_list |
| new_group.suspected_tuples = suspected_tuples |
| @@ -221,19 +226,24 @@ def _GetOutputNodes(signals): |
| return signals['compile'].get('failed_output_nodes', []) |
| +def _GetMatchingFailureGroups(build_failure_type): |
| + earliest_time = datetime.utcnow() - timedelta( |
| + seconds=MATCHING_GROUPS_SECONDS_AGO) |
| + return WfFailureGroup.query(ndb.AND( |
| + WfFailureGroup.created_time >= earliest_time, |
| + WfFailureGroup.build_failure_type == build_failure_type)).fetch() |
| + |
| + |
| def _GetMatchingCompileFailureGroups(output_nodes): |
| + groups = _GetMatchingFailureGroups(failure_type.COMPILE) |
| # Output nodes should already be unique and sorted. |
| - return WfFailureGroup.query(ndb.AND( |
| - WfFailureGroup.build_failure_type == failure_type.COMPILE, |
| - WfFailureGroup.output_nodes == output_nodes |
| - )).fetch() |
| + return [group for group in groups if group.output_nodes == output_nodes] |
| def _GetMatchingTestFailureGroups(failed_steps_and_tests): |
| - return WfFailureGroup.query(ndb.AND( |
| - WfFailureGroup.build_failure_type == failure_type.TEST, |
| - WfFailureGroup.failed_steps_and_tests == failed_steps_and_tests |
| - )).fetch() |
| + groups = _GetMatchingFailureGroups(failure_type.TEST) |
| + return [group for group in groups |
| + if group.failed_steps_and_tests == failed_steps_and_tests] |
| def _IsBuildFailureUniqueAcrossPlatforms( |
| @@ -318,7 +328,6 @@ def _NeedANewTryJob( |
| 'step', master_name, builder_name, build_number, failure_result_map, |
| failed_steps)) |
| - |
| need_new_try_job = ( |
| need_new_try_job and ReviveOrCreateTryJobEntity( |
| master_name, builder_name, build_number, force_try_job)) |