| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Performance Test Bisect Tool | 6 """Performance Test Bisect Tool |
| 7 | 7 |
| 8 This script bisects a series of changelists using binary search. It starts at | 8 This script bisects a series of changelists using binary search. It starts at |
| 9 a bad revision where a performance metric has regressed, and asks for a last | 9 a bad revision where a performance metric has regressed, and asks for a last |
| 10 known-good revision. It will then binary search across this revision range by | 10 known-good revision. It will then binary search across this revision range by |
| (...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 self.BackupOrRestoreOutputdirectory(restore=True) | 1300 self.BackupOrRestoreOutputdirectory(restore=True) |
| 1301 # Cleanup any leftovers from unzipping. | 1301 # Cleanup any leftovers from unzipping. |
| 1302 if os.path.exists(output_dir): | 1302 if os.path.exists(output_dir): |
| 1303 RmTreeAndMkDir(output_dir, skip_makedir=True) | 1303 RmTreeAndMkDir(output_dir, skip_makedir=True) |
| 1304 finally: | 1304 finally: |
| 1305 # Delete downloaded archive | 1305 # Delete downloaded archive |
| 1306 if os.path.exists(downloaded_file): | 1306 if os.path.exists(downloaded_file): |
| 1307 os.remove(downloaded_file) | 1307 os.remove(downloaded_file) |
| 1308 return False | 1308 return False |
| 1309 | 1309 |
| 1310 def PostBuildRequestAndWait(self, revision, fetch_build, patch=None): | 1310 def PostBuildRequestAndWait(self, git_revision, fetch_build, patch=None): |
| 1311 """POSTs the build request job to the try server instance. | 1311 """POSTs the build request job to the try server instance. |
| 1312 | 1312 |
| 1313 A try job build request is posted to tryserver.chromium.perf master, | 1313 A try job build request is posted to tryserver.chromium.perf master, |
| 1314 and waits for the binaries to be produced and archived on cloud storage. | 1314 and waits for the binaries to be produced and archived on cloud storage. |
| 1315 Once the build is ready and stored onto cloud, build archive is downloaded | 1315 Once the build is ready and stored onto cloud, build archive is downloaded |
| 1316 into the output folder. | 1316 into the output folder. |
| 1317 | 1317 |
| 1318 Args: | 1318 Args: |
| 1319 revision: A Git hash revision. | 1319 git_revision: A Git hash revision. |
| 1320 fetch_build: Function to check and download build from cloud storage. | 1320 fetch_build: Function to check and download build from cloud storage. |
| 1321 patch: A DEPS patch (used while bisecting 3rd party repositories). | 1321 patch: A DEPS patch (used while bisecting 3rd party repositories). |
| 1322 | 1322 |
| 1323 Returns: | 1323 Returns: |
| 1324 Downloaded archive file path when requested build exists and download is | 1324 Downloaded archive file path when requested build exists and download is |
| 1325 successful, otherwise None. | 1325 successful, otherwise None. |
| 1326 """ | 1326 """ |
| 1327 # Get SVN revision for the given SHA. | |
| 1328 svn_revision = self.source_control.SVNFindRev(revision) | |
| 1329 if not svn_revision: | |
| 1330 raise RuntimeError( | |
| 1331 'Failed to determine SVN revision for %s' % revision) | |
| 1332 | |
| 1333 def GetBuilderNameAndBuildTime(target_platform, target_arch='ia32'): | 1327 def GetBuilderNameAndBuildTime(target_platform, target_arch='ia32'): |
| 1334 """Gets builder bot name and build time in seconds based on platform.""" | 1328 """Gets builder bot name and build time in seconds based on platform.""" |
| 1335 # Bot names should match the one listed in tryserver.chromium's | 1329 # Bot names should match the one listed in tryserver.chromium's |
| 1336 # master.cfg which produces builds for bisect. | 1330 # master.cfg which produces builds for bisect. |
| 1337 if bisect_utils.IsWindowsHost(): | 1331 if bisect_utils.IsWindowsHost(): |
| 1338 if bisect_utils.Is64BitWindows() and target_arch == 'x64': | 1332 if bisect_utils.Is64BitWindows() and target_arch == 'x64': |
| 1339 return ('win_perf_bisect_builder', MAX_WIN_BUILD_TIME) | 1333 return ('win_perf_bisect_builder', MAX_WIN_BUILD_TIME) |
| 1340 return ('win_perf_bisect_builder', MAX_WIN_BUILD_TIME) | 1334 return ('win_perf_bisect_builder', MAX_WIN_BUILD_TIME) |
| 1341 if bisect_utils.IsLinuxHost(): | 1335 if bisect_utils.IsLinuxHost(): |
| 1342 if target_platform == 'android': | 1336 if target_platform == 'android': |
| 1343 return ('android_perf_bisect_builder', MAX_LINUX_BUILD_TIME) | 1337 return ('android_perf_bisect_builder', MAX_LINUX_BUILD_TIME) |
| 1344 return ('linux_perf_bisect_builder', MAX_LINUX_BUILD_TIME) | 1338 return ('linux_perf_bisect_builder', MAX_LINUX_BUILD_TIME) |
| 1345 if bisect_utils.IsMacHost(): | 1339 if bisect_utils.IsMacHost(): |
| 1346 return ('mac_perf_bisect_builder', MAX_MAC_BUILD_TIME) | 1340 return ('mac_perf_bisect_builder', MAX_MAC_BUILD_TIME) |
| 1347 raise NotImplementedError('Unsupported Platform "%s".' % sys.platform) | 1341 raise NotImplementedError('Unsupported Platform "%s".' % sys.platform) |
| 1348 if not fetch_build: | 1342 if not fetch_build: |
| 1349 return False | 1343 return False |
| 1350 | 1344 |
| 1351 bot_name, build_timeout = GetBuilderNameAndBuildTime( | 1345 bot_name, build_timeout = GetBuilderNameAndBuildTime( |
| 1352 self.opts.target_platform, self.opts.target_arch) | 1346 self.opts.target_platform, self.opts.target_arch) |
| 1353 builder_host = self.opts.builder_host | 1347 builder_host = self.opts.builder_host |
| 1354 builder_port = self.opts.builder_port | 1348 builder_port = self.opts.builder_port |
| 1355 # Create a unique ID for each build request posted to try server builders. | 1349 # Create a unique ID for each build request posted to try server builders. |
| 1356 # This ID is added to "Reason" property of the build. | 1350 # This ID is added to "Reason" property of the build. |
| 1357 build_request_id = GetSHA1HexDigest( | 1351 build_request_id = GetSHA1HexDigest( |
| 1358 '%s-%s-%s' % (svn_revision, patch, time.time())) | 1352 '%s-%s-%s' % (git_revision, patch, time.time())) |
| 1359 | 1353 |
| 1360 # Creates a try job description. | 1354 # Creates a try job description. |
| 1355 # Always use Git hash to post build request since Commit positions are |
| 1356 # not supported by builders to build. |
| 1361 job_args = { | 1357 job_args = { |
| 1362 'revision': 'src@%s' % svn_revision, | 1358 'revision': 'src@%s' % git_revision, |
| 1363 'bot': bot_name, | 1359 'bot': bot_name, |
| 1364 'name': build_request_id, | 1360 'name': build_request_id, |
| 1365 } | 1361 } |
| 1366 # Update patch information if supplied. | 1362 # Update patch information if supplied. |
| 1367 if patch: | 1363 if patch: |
| 1368 job_args['patch'] = patch | 1364 job_args['patch'] = patch |
| 1369 # Posts job to build the revision on the server. | 1365 # Posts job to build the revision on the server. |
| 1370 if bisect_builder.PostTryJob(builder_host, builder_port, job_args): | 1366 if bisect_builder.PostTryJob(builder_host, builder_port, job_args): |
| 1371 target_file, error_msg = _WaitUntilBuildIsReady( | 1367 target_file, error_msg = _WaitUntilBuildIsReady( |
| 1372 fetch_build, bot_name, builder_host, builder_port, build_request_id, | 1368 fetch_build, bot_name, builder_host, builder_port, build_request_id, |
| 1373 build_timeout) | 1369 build_timeout) |
| 1374 if not target_file: | 1370 if not target_file: |
| 1375 print '%s [revision: %s]' % (error_msg, svn_revision) | 1371 print '%s [revision: %s]' % (error_msg, git_revision) |
| 1376 return None | 1372 return None |
| 1377 return target_file | 1373 return target_file |
| 1378 print 'Failed to post build request for revision: [%s]' % svn_revision | 1374 print 'Failed to post build request for revision: [%s]' % git_revision |
| 1379 return None | 1375 return None |
| 1380 | 1376 |
| 1381 def IsDownloadable(self, depot): | 1377 def IsDownloadable(self, depot): |
| 1382 """Checks if build can be downloaded based on target platform and depot.""" | 1378 """Checks if build can be downloaded based on target platform and depot.""" |
| 1383 if (self.opts.target_platform in ['chromium', 'android'] and | 1379 if (self.opts.target_platform in ['chromium', 'android'] and |
| 1384 self.opts.gs_bucket): | 1380 self.opts.gs_bucket): |
| 1385 return (depot == 'chromium' or | 1381 return (depot == 'chromium' or |
| 1386 'chromium' in DEPOT_DEPS_NAME[depot]['from'] or | 1382 'chromium' in DEPOT_DEPS_NAME[depot]['from'] or |
| 1387 'v8' in DEPOT_DEPS_NAME[depot]['from']) | 1383 'v8' in DEPOT_DEPS_NAME[depot]['from']) |
| 1388 return False | 1384 return False |
| (...skipping 1973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3362 # bugs. If you change this, please update the perf dashboard as well. | 3358 # bugs. If you change this, please update the perf dashboard as well. |
| 3363 bisect_utils.OutputAnnotationStepStart('Results') | 3359 bisect_utils.OutputAnnotationStepStart('Results') |
| 3364 print 'Error: %s' % e.message | 3360 print 'Error: %s' % e.message |
| 3365 if opts.output_buildbot_annotations: | 3361 if opts.output_buildbot_annotations: |
| 3366 bisect_utils.OutputAnnotationStepClosed() | 3362 bisect_utils.OutputAnnotationStepClosed() |
| 3367 return 1 | 3363 return 1 |
| 3368 | 3364 |
| 3369 | 3365 |
| 3370 if __name__ == '__main__': | 3366 if __name__ == '__main__': |
| 3371 sys.exit(main()) | 3367 sys.exit(main()) |
| OLD | NEW |