scripts: package_has_missing_deps: cached InstalledPackages
If we have to load the vdb more than once, it's wasted time, and can
be pretty slow if do it a lot. Cache the results since we know this
script won't be modifying the vdb. We don't really work in general
if other processes are modifying the vdb since we'll be returning refs
to specific packages, so this isn't making the situation worse.
BUG=None
TEST=`./scripts/package_has_missing_deps --board=betty` is faster
Change-Id: Ia9ca75d28628e6f180bcb2dd7c283a38741d5895
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4879811
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Allen Webb <allenwebb@google.com>
Auto-Submit: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Allen Webb <allenwebb@google.com>
diff --git a/scripts/package_has_missing_deps.py b/scripts/package_has_missing_deps.py
index eda9206..aba02c8 100644
--- a/scripts/package_has_missing_deps.py
+++ b/scripts/package_has_missing_deps.py
@@ -128,17 +128,39 @@
self.chroot = chroot if chroot else chroot_lib.Chroot()
self.sdk_db = portage_util.PortageDB()
+ self._sdk_db_packges = None
self.db = self.sdk_db if root == "/" else portage_util.PortageDB(root)
+ self._db_packges = None
self.provided_libs_cache = {}
# Lazy initialize since it might not be needed.
self.lib_to_package_map = None
+ @property
+ def sdk_db_packages(self):
+ """Cache sdk_db.InstalledPackages().
+
+ We won't be modifying it, so it's safe for us to reuse the results.
+ """
+ if self._sdk_db_packges is None:
+ self._sdk_db_packges = self.sdk_db.InstalledPackages()
+ return self._sdk_db_packges
+
+ @property
+ def db_packages(self):
+ """Cache db.InstalledPackages().
+
+ We won't be modifying it, so it's safe for us to reuse the results.
+ """
+ if self._db_packges is None:
+ self._db_packges = self.db.InstalledPackages()
+ return self._db_packges
+
def get_package(
self, query: str, from_sdk=False
) -> Optional[portage_util.InstalledPackage]:
"""Try to find an InstalledPackage for the provided package string"""
- packages = (self.sdk_db if from_sdk else self.db).InstalledPackages()
+ packages = self.sdk_db_packages if from_sdk else self.db_packages
info = package_info.parse(query)
for package in packages:
if info.package != package.package: