Bug #42456 - When a checksum failure occurs during fetch, use a new
authorZac Medico <zmedico@gentoo.org>
Fri, 28 Mar 2008 12:03:21 +0000 (12:03 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 28 Mar 2008 12:03:21 +0000 (12:03 -0000)
PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS config variable to control how
many mirrors should be tried before aborting the download. This type
of behavior used to be enabled only in --fetchonly mode but now
it's enabled for all fetch() calls. (trunk r9462:9466)

svn path=/main/branches/2.1.2/; revision=9554

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

index 331f62d635e53096a472e352da80deb26dbf7f55..4f8b1b04ac28901b7492c2f9092ff4de9e82502f 100644 (file)
@@ -48,6 +48,9 @@ EMERGE_WARNING_DELAY="10"
 # This option will be removed and forced to yes.
 AUTOCLEAN="yes"
 
+# Number of mirrors to try when a downloaded file has an incorrect checksum.
+PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS="5"
+
 # Number of times 'emerge --sync' will run before giving up.
 PORTAGE_RSYNC_RETRIES="3"
 
index 072f24e8e06ac288f2403e52ba6cbfbbc83f1d8d..513e3ea5a2f47a4f5c1222524ba6d3d6193f82a2 100644 (file)
@@ -386,6 +386,9 @@ This variable contains flags for the \fBPORTAGE_COMPRESS\fR command.
 .B PORTAGE_ELOG_MAILSUBJECT
 Please see /etc/make.conf.example for elog documentation.
 .TP
+\fBPORTAGE_FETCH_CHECKSUM_TRY_MIRRORS\fR = \fI5\fR
+Number of mirrors to try when a downloaded file has an incorrect checksum.
+.TP
 \fBPORTAGE_NICENESS\fR = \fI[number]\fR
 The value of this variable will be added to the current nice level that
 emerge is running at.  In other words, this will not set the nice level,
index eea0cb53e0088bb58b4bee2d1c1ecd470b20edd1..d0271c8226fcd83540b2f6903d81512eb9150fee 100644 (file)
@@ -1071,7 +1071,8 @@ class config:
                "PORTAGE_BINHOST_CHUNKSIZE", "PORTAGE_CALLER",
                "PORTAGE_ECLASS_WARNING_ENABLE", "PORTAGE_ELOG_CLASSES",
                "PORTAGE_ELOG_MAILFROM", "PORTAGE_ELOG_MAILSUBJECT",
-               "PORTAGE_ELOG_MAILURI", "PORTAGE_ELOG_SYSTEM", "PORTAGE_GPG_DIR",
+               "PORTAGE_ELOG_MAILURI", "PORTAGE_ELOG_SYSTEM",
+               "PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS", "PORTAGE_GPG_DIR",
                "PORTAGE_GPG_KEY", "PORTAGE_PACKAGE_EMPTY_ABORT",
                "PORTAGE_RSYNC_EXTRA_OPTS", "PORTAGE_RSYNC_OPTS",
                "PORTAGE_RSYNC_RETRIES", "PORTAGE_USE", "PORT_LOGDIR",
@@ -3002,6 +3003,28 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks",
        # every single available mirror is a waste of bandwidth
        # and time, so there needs to be a cap.
        checksum_failure_max_tries = 5
+       v = checksum_failure_max_tries
+       try:
+               v = int(mysettings.get("PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS",
+                       checksum_failure_max_tries))
+       except (ValueError, OverflowError):
+               writemsg("!!! Variable PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS" + \
+                       " contains non-integer value: '%s'\n" % \
+                       mysettings["PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS"], noiselevel=-1)
+               writemsg("!!! Using PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS " + \
+                       "default value: %s\n" % checksum_failure_max_tries,
+                       noiselevel=-1)
+               v = checksum_failure_max_tries
+       if v < 1:
+               writemsg("!!! Variable PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS" + \
+                       " contains value less than 1: '%s'\n" % v, noiselevel=-1)
+               writemsg("!!! Using PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS " + \
+                       "default value: %s\n" % checksum_failure_max_tries,
+                       noiselevel=-1)
+               v = checksum_failure_max_tries
+       checksum_failure_max_tries = v
+       del v
+
        # Behave like the package has RESTRICT="primaryuri" after a
        # couple of checksum failures, to increase the probablility
        # of success before checksum_failure_max_tries is reached.
@@ -3464,10 +3487,7 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks",
                                                                                        pass
                                                                fetched = 1
                                                                continue
-                                                       if not fetchonly:
-                                                               fetched=2
-                                                               break
-                                                       else:
+                                                       if True:
                                                                # File is the correct size--check the checksums for the fetched
                                                                # file NOW, for those users who don't have a stable/continuous
                                                                # net connection. This way we have a chance to try to download