From a93ccf96757dc9bc9dcdfc3c45717503223ea6c9 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Tue, 24 Jun 2008 15:42:51 +0000 Subject: [PATCH] Merged from trunk 10767:10769 | 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 | 42 +++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 16ebae618..80f3c0dbb 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -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")): -- 2.26.2