diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-08-14 13:12:08 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-08-17 07:55:45 +0200 |
commit | ad9416611ab83f7799f2dcb4bf7f3ef30e9fe6f8 (patch) | |
tree | 8ae1c40f3b12b02b468b53d43ad5b4412f88a95c /apt-pkg/acquire-item.cc | |
parent | 18ccc85f02325ac87ee13bb96c92594fcfda5ea4 (diff) |
retry without same redirection mirror on 404 errors
If 9b8034a9fd40b4d05075fda719e61f6eb4c45678 serves the Release files
from a partial mirror we will end up getting 404 for some of the
indexes. Instead of giving up, we will instead ignore our same
redirection mirror constrain and ask the redirection service as a
potential hashsum mismatch is better than keeping the certain 404 error.
Diffstat (limited to 'apt-pkg/acquire-item.cc')
-rw-r--r-- | apt-pkg/acquire-item.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 623ea7518..c609af6ce 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -410,7 +410,7 @@ bool pkgAcqTransactionItem::QueueURI(pkgAcquire::ItemDesc &Item) return false; } // If we got the InRelease file via a mirror, pick all indexes directly from this mirror, too - if (TransactionManager->BaseURI.empty() == false && + if (TransactionManager->BaseURI.empty() == false && UsedMirror.empty() && URI::SiteOnly(Item.URI) != URI::SiteOnly(TransactionManager->BaseURI)) { // this ensures we rewrite only once and only the first step @@ -1226,9 +1226,15 @@ bool pkgAcqMetaBase::CheckDownloadDone(pkgAcqTransactionItem * const I, const st if (I->UsedMirror.empty() == false && _config->FindB("Acquire::SameMirrorForAllIndexes", true)) { if (APT::String::Endswith(I->Desc.URI, "InRelease")) + { TransactionManager->BaseURI = I->Desc.URI.substr(0, I->Desc.URI.length() - strlen("InRelease")); + TransactionManager->UsedMirror = I->UsedMirror; + } else if (APT::String::Endswith(I->Desc.URI, "Release")) + { TransactionManager->BaseURI = I->Desc.URI.substr(0, I->Desc.URI.length() - strlen("Release")); + TransactionManager->UsedMirror = I->UsedMirror; + } } std::string const FileName = LookupTag(Message,"Filename"); @@ -2935,6 +2941,20 @@ void pkgAcqIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * { pkgAcqBaseIndex::Failed(Message,Cnf); + if (UsedMirror.empty() == false && UsedMirror != "DIRECT" && + LookupTag(Message, "FailReason") == "HttpError404") + { + UsedMirror = "DIRECT"; + if (Desc.URI.find("/by-hash/") != std::string::npos) + CompressionExtensions = "by-hash " + CompressionExtensions; + else + CompressionExtensions = CurrentCompressionExtension + ' ' + CompressionExtensions; + Desc.Description = Target.Description; + Init(Target.URI, Desc.Description, Desc.ShortDesc); + Status = StatIdle; + return; + } + // authorisation matches will not be fixed by other compression types if (Status != StatAuthError) { |