From 49f405428fe1d86061c41aad16d5c413170b1ca6 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 4 Oct 2010 20:14:17 -0700 Subject: [PATCH] Optimize depgraph/portdbapi cache handling. --- pym/_emerge/depgraph.py | 9 ++++++++- pym/portage/dbapi/porttree.py | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 3b0fdbec9..ac23f4ba0 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -2468,7 +2468,14 @@ class depgraph(object): db = root_config.trees[self.pkg_tree_map[pkg_type]].dbapi if hasattr(db, "xmatch"): - cpv_list = db.xmatch("match-all", atom) + # For portdbapi we match only against the cpv, in order + # to bypass unecessary cache access for things like IUSE + # and SLOT. Later, we cache the metadata in a Package + # instance, and use that for further matching. This + # optimization is especially relevant since + # pordbapi.aux_get() does not cache calls that have + # myrepo or mytree arguments. + cpv_list = db.xmatch("match-all-cpv-only", atom) else: cpv_list = db.match(atom) diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 317d4a01e..2d515e07c 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -759,7 +759,8 @@ class portdbapi(dbapi): def freeze(self): for x in "bestmatch-visible", "cp-list", "list-visible", "match-all", \ - "match-visible", "minimum-all", "minimum-visible": + "match-all-cpv-only", "match-visible", "minimum-all", \ + "minimum-visible": self.xcache[x]={} self.frozen=1 @@ -782,7 +783,18 @@ class portdbapi(dbapi): mydep = dep_expand(origdep, mydb=self, settings=self.settings) mykey = mydep.cp - if level == "list-visible": + if level == "match-all-cpv-only": + # match *all* packages, only against the cpv, in order + # to bypass unecessary cache access for things like IUSE + # and SLOT. + if mydep == mykey: + # Share cache with match-all/cp_list + # when the result is the same. + level = "match-all" + myval = self.cp_list(mykey) + else: + myval = match_from_list(mydep, self.cp_list(mykey)) + elif level == "list-visible": #a list of all visible packages, not called directly (just by xmatch()) #myval = self.visible(self.cp_list(mykey)) -- 2.26.2