From: Zac Medico Date: Fri, 28 Mar 2008 12:03:21 +0000 (-0000) Subject: Bug #42456 - When a checksum failure occurs during fetch, use a new X-Git-Tag: v2.1.5~336 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=71c85df7504ec011a81999e9e787e55a217b20d2;p=portage.git Bug #42456 - When a checksum failure occurs during fetch, use a new 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 --- diff --git a/cnf/make.globals b/cnf/make.globals index 331f62d63..4f8b1b04a 100644 --- a/cnf/make.globals +++ b/cnf/make.globals @@ -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" diff --git a/man/make.conf.5 b/man/make.conf.5 index 072f24e8e..513e3ea5a 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -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, diff --git a/pym/portage.py b/pym/portage.py index eea0cb53e..d0271c822 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -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