diff options
author | David Kalnischkies <david@kalnischkies.de> | 2015-05-19 10:40:55 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2015-06-07 09:42:53 +0200 |
commit | 58702f8563a443a7c6e66253b259c2488b877290 (patch) | |
tree | fcc3b9d5689237cf36fb496989b670299c1641aa | |
parent | 4fc6b7570c3e97b65c118b58cdf6729fa94c9b03 (diff) |
don't try other compressions on hashsum mismatch
If we e.g. fail on hash verification for Packages.xz its highly unlikely
that it will be any better with Packages.gz, so we just waste download
bandwidth and time. It also causes us always to fallback to the
uncompressed Packages file for which the error will finally be reported,
which in turn confuses users as the file usually doesn't exist on the
mirrors, so a bug in apt is suspected for even trying it…
-rw-r--r-- | apt-pkg/acquire-item.cc | 33 | ||||
-rwxr-xr-x | test/integration/test-apt-update-not-modified | 23 | ||||
-rwxr-xr-x | test/integration/test-apt-update-rollback | 4 | ||||
-rwxr-xr-x | test/integration/test-apt-update-transactions | 8 |
4 files changed, 52 insertions, 16 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 8155b9bfe..cf89717c4 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -154,7 +154,18 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) return; } - Status = StatError; + switch (Status) + { + case StatIdle: + case StatFetching: + case StatDone: + Status = StatError; + break; + case StatAuthError: + case StatError: + case StatTransientNetworkError: + break; + } Complete = false; Dequeue(); } @@ -167,7 +178,7 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf) RenameOnError(MaximumSizeExceeded); // report mirror failure back to LP if we actually use a mirror - if(FailReason.size() != 0) + if(FailReason.empty() == false) ReportMirrorFailure(FailReason); else ReportMirrorFailure(ErrorText); @@ -1403,17 +1414,19 @@ void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) { Item::Failed(Message,Cnf); - size_t const nextExt = CompressionExtensions.find(' '); - if (nextExt != std::string::npos) + // authorisation matches will not be fixed by other compression types + if (Status != StatAuthError) { - CompressionExtensions = CompressionExtensions.substr(nextExt+1); - Init(RealURI, Desc.Description, Desc.ShortDesc); - Status = StatIdle; - return; + size_t const nextExt = CompressionExtensions.find(' '); + if (nextExt != std::string::npos) + { + CompressionExtensions = CompressionExtensions.substr(nextExt+1); + Init(RealURI, Desc.Description, Desc.ShortDesc); + Status = StatIdle; + return; + } } - Item::Failed(Message,Cnf); - if(Target->IsOptional() && ExpectedHashes.empty() && Stage == STAGE_DOWNLOAD) Status = StatDone; else diff --git a/test/integration/test-apt-update-not-modified b/test/integration/test-apt-update-not-modified index b1d55c156..bac33d531 100755 --- a/test/integration/test-apt-update-not-modified +++ b/test/integration/test-apt-update-not-modified @@ -14,6 +14,7 @@ setupaptarchive --no-update methodtest() { msgmsg 'Test InRelease with' "$1" rm -rf rootdir/var/lib/apt/lists + cp -a aptarchive/dists aptarchive/dists.good # get our cache populated testsuccess aptget update listcurrentlistsdirectory > listsdir.lst @@ -30,8 +31,27 @@ Reading package lists..." aptget update Reading package lists..." aptget update testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)" - # readd arch so its downloaded again + # readd arch so its downloaded again… configarchitecture 'amd64' 'i386' + # … but oh noes, hashsum mismatch! + find aptarchive/dists/unstable/main/binary-amd64/ -type f -delete + cat >> aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF + +Package: thisisbad +Architecture: amd64 +Version: 1 +EOF + compressfile aptarchive/dists/unstable/main/binary-amd64/Packages + testfailureequal "Hit $1 unstable InRelease +Get:1 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists.good/unstable/main/binary-amd64/Packages.gz') B] +W: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz Hash Sum mismatch + +E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update + testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)" + rm -rf aptarchive/dists + cp -a aptarchive/dists.good aptarchive/dists + + # … now everything is fine again testsuccessequal "Hit $1 unstable InRelease Get:1 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') B] Reading package lists..." aptget update @@ -46,7 +66,6 @@ Reading package lists..." aptget update msgmsg 'Test Release.gpg with' "$1" rm -rf rootdir/var/lib/apt/lists - cp -a aptarchive/dists aptarchive/dists.good find aptarchive/dists -name 'InRelease' -delete # get our cache populated testsuccess aptget update diff --git a/test/integration/test-apt-update-rollback b/test/integration/test-apt-update-rollback index b464a04a1..6fd901715 100755 --- a/test/integration/test-apt-update-rollback +++ b/test/integration/test-apt-update-rollback @@ -60,7 +60,7 @@ test_inrelease_to_broken_hash_reverts_all() { break_repository_sources_index '+1hour' # test the error condition - testfailureequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources Hash Sum mismatch + testfailureequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources.gz Hash Sum mismatch E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq # ensure that the Packages file is also rolled back @@ -127,7 +127,7 @@ E: There are problems and -y was used without --force-yes" aptget install -qq -y add_new_package '+1hour' break_repository_sources_index '+1hour' - testfailureequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources Hash Sum mismatch + testfailureequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources.gz Hash Sum mismatch E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq diff --git a/test/integration/test-apt-update-transactions b/test/integration/test-apt-update-transactions index 63b318056..152e1617a 100755 --- a/test/integration/test-apt-update-transactions +++ b/test/integration/test-apt-update-transactions @@ -8,6 +8,7 @@ TESTDIR=$(readlink -f $(dirname $0)) setupenvironment configarchitecture 'i386' +configcompression '.' 'gz' insertpackage 'unstable' 'foo' 'all' '1.0' insertsource 'unstable' 'foo' 'all' '1.0' @@ -15,7 +16,8 @@ insertsource 'unstable' 'foo' 'all' '1.0' setupaptarchive --no-update breakfile() { - mv "$1" "${1}.bak" + mv "${1}" "${1}.bak" + mv "${1}.gz" "${1}.gz.bak" cat > "$1" <<EOF Package: bar EOF @@ -23,6 +25,7 @@ EOF } restorefile() { mv "${1}.bak" "$1" + mv "${1}.gz.bak" "${1}.gz" } testrun() { @@ -54,7 +57,8 @@ testsetup() { testrun 'listsdir.lst' msgmsg 'Test with initial data over' "$1" - testsuccess aptget update + rm -rf rootdir/var/lib/apt/lists + testsuccess aptget update -o Debug::pkgAcquire::Worker=1 listcurrentlistsdirectory > listsdir.lst redatereleasefiles '+1hour' testrun 'listsdir.lst' |