service: optimize repetitive android depgraph generation
These android funcs call determine_android_package internally which
turns into a full `emerge -pv virtual/target-os` call which can be
pretty slow. The calls all do the same exact work each time, so we
end up just wasting CPU cycles. Hoist the call up a level so we can
share the results and only build the depgraph once.
BUG=chromium:1051161
TEST=CQ passes
Change-Id: I7f9321836e149b9e2072f99893632a186d81e9ec
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2739376
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Michael Mortensen <mmortensen@google.com>
diff --git a/api/controller/packages.py b/api/controller/packages.py
index dc9d29a..81ee246 100644
--- a/api/controller/packages.py
+++ b/api/controller/packages.py
@@ -159,21 +159,27 @@
def GetTargetVersions(input_proto, output_proto, _config):
"""Returns the target versions."""
build_target = controller_util.ParseBuildTarget(input_proto.build_target)
- # Android version.
- android_version = packages.determine_android_version(build_target.name)
- logging.info('Found android version: %s', android_version)
- if android_version:
- output_proto.android_version = android_version
- # Android branch version.
- android_branch_version = packages.determine_android_branch(build_target.name)
- logging.info('Found android branch version: %s', android_branch_version)
- if android_branch_version:
- output_proto.android_branch_version = android_branch_version
- # Android target version.
- android_target_version = packages.determine_android_target(build_target.name)
- logging.info('Found android target version: %s', android_target_version)
- if android_target_version:
- output_proto.android_target_version = android_target_version
+ # Look up the android package here once since the operation is so slow.
+ android_package = packages.determine_android_package(build_target.name)
+ if android_package:
+ # Android version.
+ android_version = packages.determine_android_version(
+ build_target.name, package=android_package)
+ logging.info('Found android version: %s', android_version)
+ if android_version:
+ output_proto.android_version = android_version
+ # Android branch version.
+ android_branch_version = packages.determine_android_branch(
+ build_target.name, package=android_package)
+ logging.info('Found android branch version: %s', android_branch_version)
+ if android_branch_version:
+ output_proto.android_branch_version = android_branch_version
+ # Android target version.
+ android_target_version = packages.determine_android_target(
+ build_target.name, package=android_package)
+ logging.info('Found android target version: %s', android_target_version)
+ if android_target_version:
+ output_proto.android_target_version = android_target_version
# TODO(crbug/1019770): Investigate cases where builds_chrome is true but
# chrome_version is None.
diff --git a/api/controller/packages_unittest.py b/api/controller/packages_unittest.py
index e1c173c..35ba7a9 100644
--- a/api/controller/packages_unittest.py
+++ b/api/controller/packages_unittest.py
@@ -423,18 +423,13 @@
chrome_version_mock = self.PatchObject(packages_service,
'determine_chrome_version',
return_value=chrome_version)
- android_version = 'android_test_version'
- android_version_mock = self.PatchObject(packages_service,
- 'determine_android_version',
- return_value=android_version)
+ android_package = 'chromeos-base/android-container-pi-10.3'
+ self.PatchObject(packages_service, 'determine_android_package',
+ return_value=android_package)
android_branch = 'android_test_branch'
android_branch_mock = self.PatchObject(packages_service,
'determine_android_branch',
return_value=android_branch)
- android_target = 'android_test_target'
- android_target_mock = self.PatchObject(packages_service,
- 'determine_android_target',
- return_value=android_target)
platform_version = '12345.1.2'
self.PatchObject(packages_service, 'determine_platform_version',
return_value=platform_version)
@@ -447,9 +442,9 @@
request = self._GetRequest(board='betty')
packages_controller.GetTargetVersions(request, self.response,
self.api_config)
- self.assertEqual(self.response.android_version, android_version)
+ self.assertEqual(self.response.android_version, '10.3')
self.assertEqual(self.response.android_branch_version, android_branch)
- self.assertEqual(self.response.android_target_version, android_target)
+ self.assertEqual(self.response.android_target_version, 'cheets')
self.assertEqual(self.response.chrome_version, chrome_version)
self.assertEqual(self.response.platform_version, platform_version)
self.assertEqual(self.response.milestone_version, milestone_version)
@@ -457,12 +452,8 @@
# Verify call to determine_chrome_version passes a build_target object.
build_target = build_target_lib.BuildTarget('betty')
chrome_version_mock.assert_called_with(build_target)
- # Verify call to determine_android_version passes a list of the board name.
- android_version_mock.assert_called_with('betty')
# Verify call to determine_android_branch passes a board name.
- android_branch_mock.assert_called_with('betty')
- # Verify call to determine_android_target passes a board name.
- android_target_mock.assert_called_with('betty')
+ android_branch_mock.assert_called_with('betty', package=android_package)
def testGetTargetVersionsWithPackagesSet(self):
"""Verify packages pass through and basic return values."""
@@ -475,15 +466,12 @@
chrome_version = '76.0.1.2'
self.PatchObject(packages_service, 'determine_chrome_version',
return_value=chrome_version)
- android_version = 'android_test_version'
- self.PatchObject(packages_service, 'determine_android_version',
- return_value=android_version)
+ android_package = 'chromeos-base/android-container-pi-10.3'
+ self.PatchObject(packages_service, 'determine_android_package',
+ return_value=android_package)
android_branch = 'android_test_branch'
self.PatchObject(packages_service, 'determine_android_branch',
return_value=android_branch)
- android_target = 'android_test_target'
- self.PatchObject(packages_service, 'determine_android_target',
- return_value=android_target)
platform_version = '12345.1.2'
self.PatchObject(packages_service, 'determine_platform_version',
return_value=platform_version)
@@ -508,9 +496,9 @@
packages_controller.GetTargetVersions(request, self.response,
self.api_config)
- self.assertEqual(self.response.android_version, android_version)
+ self.assertEqual(self.response.android_version, '10.3')
self.assertEqual(self.response.android_branch_version, android_branch)
- self.assertEqual(self.response.android_target_version, android_target)
+ self.assertEqual(self.response.android_target_version, 'cheets')
self.assertEqual(self.response.chrome_version, chrome_version)
self.assertEqual(self.response.platform_version, platform_version)
self.assertEqual(self.response.milestone_version, milestone_version)
@@ -525,11 +513,7 @@
self.PatchObject(packages_service, 'determine_platform_version',
return_value=platform_version)
self.PatchObject(packages_service, 'builds', return_value=False)
- self.PatchObject(packages_service, 'determine_android_version',
- return_value=None)
- self.PatchObject(packages_service, 'determine_android_branch',
- return_value=None)
- self.PatchObject(packages_service, 'determine_android_target',
+ self.PatchObject(packages_service, 'determine_android_package',
return_value=None)
request = self._GetRequest(board='betty')
packages_controller.GetTargetVersions(request, self.response,