diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-04-08 05:38:33 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-04-08 05:38:33 +0000 |
commit | f52995bf6e8f10f033001058beab422bd1e27b28 (patch) | |
tree | f962c6abb79545ecc32f1e02ccd666d1e7ef6e04 /bin | |
parent | db604632532287ce752e3d143c992a1d35105d42 (diff) | |
download | portage-f52995bf6e8f10f033001058beab422bd1e27b28.tar.gz portage-f52995bf6e8f10f033001058beab422bd1e27b28.tar.bz2 portage-f52995bf6e8f10f033001058beab422bd1e27b28.zip |
* Optimize metadata caching in pordbapi and bindbapi so that cache is
never pulled for the same package twice.
* Cache a Package instances constructed during package selection
and reuse them during later package selections.
(trunk r9741)
svn path=/main/branches/2.1.2/; revision=9752
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/emerge | 75 |
1 files changed, 40 insertions, 35 deletions
diff --git a/bin/emerge b/bin/emerge index a4865d1ab..1eeae340c 100755 --- a/bin/emerge +++ b/bin/emerge @@ -1485,7 +1485,7 @@ class CompositeDbapi(object): except portage_exception.InvalidDependString: arg = None arg_cp = None - else: + if arg: arg_cp = portage.dep_getkey(arg) if arg and arg_cp != pkg.cp: # If this argument matches via PROVIDE but there is a @@ -1619,6 +1619,8 @@ class depgraph: self._world_problems = False self._select_package = self._select_pkg_highest_available self._highest_pkg_cache = {} + # All Package instances + self._pkg_cache = {} def _show_slot_collision_notice(self): """Show an informational message advising the user to mask one of the @@ -2316,6 +2318,11 @@ class depgraph: cpv_list = db.xmatch("match-all", atom) else: cpv_list = db.match(atom) + if not cpv_list: + continue + pkg_status = "merge" + if installed or onlydeps: + pkg_status = "nomerge" # descending order cpv_list.reverse() for cpv in cpv_list: @@ -2324,33 +2331,47 @@ class depgraph: cpv in vardb.match(atom): break reinstall_for_flags = None - try: - metadata = dict(izip(db_keys, - db.aux_get(cpv, db_keys))) - except KeyError: - continue - if not built: - if "?" in metadata["LICENSE"]: + cache_key = (pkg_type, root, cpv, pkg_status) + calculated_use = True + pkg = self._pkg_cache.get(cache_key) + if pkg is None: + calculated_use = False + try: + metadata = dict(izip(self._mydbapi_keys, + db.aux_get(cpv, self._mydbapi_keys))) + except KeyError: + continue + if not built and ("?" in metadata["LICENSE"] or \ + "?" in metadata["PROVIDE"]): + # This is avoided whenever possible because + # it's expensive. It only needs to be done here + # if it has an effect on visibility. pkgsettings.setcpv(cpv, mydb=metadata) metadata["USE"] = pkgsettings["PORTAGE_USE"] - else: - metadata["USE"] = "" + calculated_use = True + pkg = Package(built=built, cpv=cpv, + installed=installed, metadata=metadata, + onlydeps=onlydeps, root=root, type_name=pkg_type) + self._pkg_cache[pkg] = pkg myarg = None if root == self.target_root: try: myarg = self._set_atoms.findAtomForPackage( - cpv, metadata) + pkg.cpv, pkg.metadata) except portage_exception.InvalidDependString: if not installed: # masked by corruption continue - pkg = Package(built=built, cpv=cpv, installed=installed, - metadata=metadata, type_name=pkg_type) if not installed: if myarg: found_available_arg = True if not visible(pkgsettings, pkg): continue + if not built and not calculated_use: + # This is avoided whenever possible because + # it's expensive. + pkgsettings.setcpv(cpv, mydb=pkg.metadata) + pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"] if pkg.cp == atom_cp: if highest_version is None: highest_version = pkg @@ -2362,9 +2383,7 @@ class depgraph: # will always end with a break statement below # this point. if find_existing_node: - slot_atom = "%s:%s" % ( - portage.cpv_getkey(cpv), metadata["SLOT"]) - e_pkg = self._slot_pkg_map[root].get(slot_atom) + e_pkg = self._slot_pkg_map[root].get(pkg.slot_atom) if not e_pkg: break cpv_slot = "%s:%s" % \ @@ -2388,9 +2407,9 @@ class depgraph: ("--newuse" in self.myopts or \ "--reinstall" in self.myopts): iuses = set(filter_iuse_defaults( - metadata["IUSE"].split())) - old_use = metadata["USE"].split() - mydb = metadata + pkg.metadata["IUSE"].split())) + old_use = pkg.metadata["USE"].split() + mydb = pkg.metadata if myeb and not usepkgonly: mydb = portdb if myeb: @@ -2416,7 +2435,7 @@ class depgraph: ("--newuse" in self.myopts or \ "--reinstall" in self.myopts) and \ cpv in vardb.match(atom): - pkgsettings.setcpv(cpv, mydb=metadata) + pkgsettings.setcpv(cpv, mydb=pkg.metadata) forced_flags = set() forced_flags.update(pkgsettings.useforce) forced_flags.update(pkgsettings.usemask) @@ -2425,7 +2444,7 @@ class depgraph: vardb.aux_get(cpv, ["IUSE"])[0].split())) cur_use = pkgsettings["PORTAGE_USE"].split() cur_iuse = set(filter_iuse_defaults( - metadata["IUSE"].split())) + pkg.metadata["IUSE"].split())) reinstall_for_flags = \ self._reinstall_for_flags( forced_flags, old_use, old_iuse, @@ -2439,22 +2458,8 @@ class depgraph: not must_reinstall and \ cpv in vardb.match(atom): break - # Metadata accessed above is cached internally by - # each db in order to optimize visibility checks. - # Now that all possible checks visibility checks - # are complete, it's time to pull the rest of the - # metadata (including *DEPEND). This part is more - # expensive, so avoid it whenever possible. - metadata.update(izip(self._mydbapi_keys, - db.aux_get(cpv, self._mydbapi_keys))) if not built: - pkgsettings.setcpv(cpv, mydb=metadata) - metadata["USE"] = pkgsettings["PORTAGE_USE"] myeb = cpv - pkg = Package(type_name=pkg_type, root=root, - cpv=cpv, metadata=metadata, - built=built, installed=installed, - onlydeps=onlydeps) matched_packages.append(pkg) if reinstall_for_flags: self._reinstall_nodes[pkg] = \ |