* Make portdbapi.aux_get() automatically pull pre-generated metadata
authorZac Medico <zmedico@gentoo.org>
Mon, 21 Apr 2008 04:00:24 +0000 (04:00 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 21 Apr 2008 04:00:24 +0000 (04:00 -0000)
  directly from the metadata/cache/ directory when metadata-transfer
  is not enabled in FEATURES. This makes all cache modules behave
  similar to existing metadata_overlay module, except when
  FEATURES="metadata-transfer" has been explicitly enabled.

* Remove metadata-transfer from FEATURES in make.globals so that it's
  no longer enabled by default. Users will be happy about this since
  the "Updating Portage cache" part of emerge --sync can be more time
  consuming than the rsync run itself. It's also nicer when when using
  PORTDIR over nfs or bind mounted in a chroot since there's no need
  to run emerge --metadata.

* Update FEATURES="metadata-transfer" docs to warn users of the rsync
  tree to modify eclases in PORTDIR_OVERLAY if necessary instead of
  doing it directly in the rsync tree.

* Relevant updates to /etc/portage/modules docs.

svn path=/main/trunk/; revision=9930

cnf/make.globals
man/make.conf.5
man/portage.5
pym/portage/dbapi/porttree.py

index 5e8150131f9648bd1d8ed128e619976ba94e5493..594278f19c85478aacc7e2e4948ad587c3bd66c5 100644 (file)
@@ -38,7 +38,7 @@ FETCHCOMMAND="/usr/bin/wget -t 5 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\"
 RESUMECOMMAND="/usr/bin/wget -c -t 5 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
 
 # Default user options
-FEATURES="distlocks parallel-fetch metadata-transfer sandbox sfperms strict unmerge-orphans userfetch"
+FEATURES="distlocks parallel-fetch sandbox sfperms strict unmerge-orphans userfetch"
 
 # Enable for global testing
 FEATURES="${FEATURES} preserve-libs"
index a8476458bf1ecb14ba7d1e62a8a0de029018d923..46013fc5c3553341c5938ad60c43baff00a0a51e 100644 (file)
@@ -215,6 +215,16 @@ when \fImirror\fR is also in the \fBebuild\fR(5) \fBRESTRICT\fR variable.
 .TP
 .B metadata\-transfer
 Automatically perform a metadata transfer when `emerge \-\-sync` is run.
+In versions of portage greater than 2.1.5, this feature is disabled by
+default. When metadata\-transfer is disabled, metadata cache from the
+${PORTDIR}/metadata/cache/ directory will be used directly (if available)
+and eclasses in ${PORTDIR}/eclass/ must not be modified except by
+`emerge \-\-sync` operations since the cache validation mechanism
+will not recognize eclass modifications. Normally, this issue only
+pertains to users of the rsync tree since the cvs tree does not contain
+a metadata/cache/ directory. Users of the rsync tree who want to modify
+eclasses should use \fBPORTDIR_OVERLAY\fR in order for the cache
+validation mechanism to work correctly.
 .TP
 .B mirror
 Fetch everything in \fBSRC_URI\fR regardless of \fBUSE\fR settings,
index 0599c5e09301d4fc28b48c9daf5bc3a5c946fb45..792491b8e0e03137178e9f93984e23c275086df8 100644 (file)
@@ -384,18 +384,15 @@ override.
 
 .I Example:
 .nf
-portdbapi.auxdbmodule = portage.cache.metadata_overlay.database
-.fi
-
-The metadata_overlay cache module makes it possible to disable
-FEATURES="metadata-transfer" in \fBmake.conf\fR(5).  When the user initially
-enables metadata_overlay in /etc/portage/modules, all of the cache files
-contained in /var/cache/edb/dep/${PORTDIR} must be manually removed in order
-to avoid unecessary cache regeneration.  In addition, users of the
-metadata_overlay module must never modify eclasses in ${PORTDIR} because
-portage will not be able to detect that cache regeneration is necessary.  If
-the user would like to modify eclasses, it is safe to use metadata_overlay
-together with PORTDIR_OVERLAY in \fBmake.conf\fR.
+portdbapi.auxdbmodule = portage.cache.sqlite.database
+.fi
+
+After changing the portdbapi.auxdbmodule setting, it may be necessary to
+transfer or regenerate metadata cache. Users of the rsync tree need to
+run `emerge \-\-metadata` if they have enabled FEATURES="metadata-transfer"
+in \fBmake.conf\fR(5). In order to regenerate metadata for repositories
+listed in \fBPORTDIR_OVERLAY\fR or a cvs tree, run `emerge \-\-regen`
+(see \fBemerge\fR(1)).
 .TP
 .BR package.keywords
 Per\-package KEYWORDS.  Useful for mixing unstable packages in with a normally 
index 3c0bc01b5b4eb728b0b1a06c314a0025b47dfe69..fdf0f1168f992b9b1d61e358a0cc32654f29ddb4 100644 (file)
@@ -107,6 +107,7 @@ class portdbapi(dbapi):
                
                self.auxdbmodule = self.mysettings.load_best_module("portdbapi.auxdbmodule")
                self.auxdb = {}
+               self._pregen_auxdb = {}
                self._init_cache_dirs()
                # XXX: REMOVE THIS ONCE UNUSED_0 IS YANKED FROM auxdbkeys
                # ~harring
@@ -125,6 +126,11 @@ class portdbapi(dbapi):
                                # location, label, auxdbkeys
                                self.auxdb[x] = self.auxdbmodule(
                                        self.depcachedir, x, filtered_auxdbkeys, gid=portage_gid)
+               if "metadata-transfer" not in self.mysettings.features:
+                       for x in self.porttrees:
+                               if os.path.isdir(os.path.join(x, "metadata", "cache")):
+                                       self._pregen_auxdb[x] = self.metadbmodule(
+                                               x, "metadata/cache", filtered_auxdbkeys, readonly=True)
                # Selectively cache metadata in order to optimize dep matching.
                self._aux_cache_keys = set(
                        ["DEPEND", "EAPI", "IUSE", "KEYWORDS", "LICENSE",
@@ -283,28 +289,41 @@ class portdbapi(dbapi):
                                noiselevel=-1)
                        raise KeyError(mycpv)
 
-               try:
-                       mydata = self.auxdb[mylocation][mycpv]
-                       eapi = mydata.get("EAPI","").strip()
-                       if not eapi:
-                               eapi = "0"
-                       if eapi.startswith("-") and eapi_is_supported(eapi[1:]):
-                               doregen = True
-                       elif emtime != long(mydata.get("_mtime_", 0)):
-                               doregen = True
-                       elif len(mydata.get("_eclasses_", [])) > 0:
-                               doregen = not self.eclassdb.is_eclass_data_valid(mydata["_eclasses_"])
-                       else:
-                               doregen = False
-                               
-               except KeyError:
-                       doregen = True
-               except CacheError:
-                       doregen = True
+               # Pull pre-generated metadata from the metadata/cache/
+               # directory if it exists and is valid, otherwise fall
+               # back to the normal writable cache.
+               auxdbs = []
+               pregen_auxdb = self._pregen_auxdb.get(mylocation)
+               if pregen_auxdb is not None:
+                       auxdbs.append(pregen_auxdb)
+               auxdbs.append(self.auxdb[mylocation])
+
+               doregen = True
+               for auxdb in auxdbs:
                        try:
-                               del self.auxdb[mylocation][mycpv]
+                               mydata = auxdb[mycpv]
+                               eapi = mydata.get("EAPI","").strip()
+                               if not eapi:
+                                       eapi = "0"
+                               if eapi.startswith("-") and eapi_is_supported(eapi[1:]):
+                                       pass
+                               elif emtime != long(mydata.get("_mtime_", 0)):
+                                       pass
+                               elif len(mydata.get("_eclasses_", [])) > 0:
+                                       if self.eclassdb.is_eclass_data_valid(mydata["_eclasses_"]):
+                                               doregen = False
+                               else:
+                                       doregen = False
                        except KeyError:
                                pass
+                       except CacheError:
+                               if auxdb is not pregen_auxdb:
+                                       try:
+                                               del auxdb[mycpv]
+                                       except KeyError:
+                                               pass
+                       if not doregen:
+                               break
 
                writemsg("auxdb is valid: "+str(not doregen)+" "+str(pkg)+"\n", 2)