Merged from trunk 10767:10769
authorFabian Groffen <grobian@gentoo.org>
Tue, 24 Jun 2008 15:42:51 +0000 (15:42 -0000)
committerFabian Groffen <grobian@gentoo.org>
Tue, 24 Jun 2008 15:42:51 +0000 (15:42 -0000)
   | 10768   | Fix some remaining corner cases that cause bug #220341 to    |
   | zmedico | reappear intermittently. Thanks to pva for reporting.        |

   | 10769   | Clear dbapi caches just after deleting the depgraph in       |
   | zmedico | action_build(). This trims down the heap size by a few megs, |
   |         | for bug #229069.                                             |

svn path=/main/branches/prefix/; revision=10770

pym/_emerge/__init__.py

index 16ebae618e3fd084ba00e14f1b1007282b27775f..80f3c0dbb874f67d5621afb79a100a3da9e1be13 100644 (file)
@@ -20,6 +20,7 @@ try:
 except KeyboardInterrupt:
        sys.exit(1)
 
+import gc
 import os, stat
 import platform
 
@@ -3140,21 +3141,22 @@ class depgraph(object):
                                # the newly built package still won't have the expected slot.
                                # Therefore, assume that such SLOT dependencies are already
                                # satisfied rather than forcing a rebuild.
-                               if installed and not cpv_list and \
-                                       matched_packages and atom.slot:
-                                       for pkg in matched_packages:
-                                               if not vardb.cpv_exists(pkg.cpv):
+                               if installed and not cpv_list and atom.slot:
+                                       for cpv in db.match(atom.cp):
+                                               slot_available = False
+                                               for other_db, other_type, other_built, \
+                                                       other_installed, other_keys in dbs:
+                                                       try:
+                                                               if atom.slot == \
+                                                                       other_db.aux_get(cpv, ["SLOT"])[0]:
+                                                                       slot_available = True
+                                                                       break
+                                                       except KeyError:
+                                                               pass
+                                               if not slot_available:
                                                        continue
-                                               inst_pkg = self._pkg_cache.get(
-                                                       (pkg_type, root, pkg.cpv, "nomerge"))
-                                               if inst_pkg is None:
-                                                       metadata = izip(self._mydbapi_keys,
-                                                               vardb.aux_get(pkg.cpv, self._mydbapi_keys))
-                                                       inst_pkg = Package(built=built, cpv=pkg.cpv,
-                                                               installed=installed, metadata=metadata,
-                                                               onlydeps=onlydeps, root_config=root_config,
-                                                               type_name=pkg_type)
-                                                       self._pkg_cache[inst_pkg] = inst_pkg
+                                               inst_pkg = self._pkg(cpv, "installed",
+                                                       root_config, installed=installed)
                                                # Remove the slot from the atom and verify that
                                                # the package matches the resulting atom.
                                                atom_without_slot = portage.dep.remove_slot(atom)
@@ -8828,6 +8830,8 @@ def action_build(settings, trees, mtimedb,
                                time.sleep(3) # allow the parent to have first fetch
                        mymergelist = mydepgraph.altlist()
                        del mydepgraph
+                       clear_caches(trees)
+
                        retval = mergetask.merge(mymergelist, favorites, mtimedb)
                        merge_count = mergetask.curval
                else:
@@ -8869,6 +8873,8 @@ def action_build(settings, trees, mtimedb,
                        pkglist = mydepgraph.altlist()
                        mydepgraph.saveNomergeFavorites()
                        del mydepgraph
+                       clear_caches(trees)
+
                        mergetask = MergeTask(settings, trees, myopts)
                        retval = mergetask.merge(pkglist, favorites, mtimedb)
                        merge_count = mergetask.curval
@@ -8992,6 +8998,14 @@ def validate_ebuild_environment(trees):
                settings = trees[myroot]["vartree"].settings
                settings.validate()
 
+def clear_caches(trees):
+       for d in trees.itervalues():
+               d["porttree"].dbapi.melt()
+               d["porttree"].dbapi._aux_cache.clear()
+               d["bintree"].dbapi._aux_cache.clear()
+               d["bintree"].dbapi._clear_cache()
+       gc.collect()
+
 def load_emerge_config(trees=None):
        kwargs = {}
        for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"), ("target_root", "ROOT")):