From 30979dd7616105302f06af82f419eb62d7b613f8 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 24 Apr 2016 10:35:08 +0200 Subject: show more details for "Writing more data" errors, too They are the small brothers of the hashsum mismatch, so they deserve a similar treatment even through we have for architectual reasons not a much to display as for hashsum mismatches for now. --- apt-pkg/acquire-item.cc | 63 +++++++++++++++++++++++++++++++---------------- apt-pkg/acquire-worker.cc | 20 +++++++++++---- 2 files changed, 57 insertions(+), 26 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index aeadbcfc7..ceed5a510 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -679,35 +679,59 @@ void pkgAcquire::Item::Failed(string const &Message,pkgAcquire::MethodConfig con Dequeue(); } + string const FailReason = LookupTag(Message, "FailReason"); + enum { MAXIMUM_SIZE_EXCEEDED, HASHSUM_MISMATCH, OTHER } failreason = OTHER; + if ( FailReason == "MaximumSizeExceeded") + failreason = MAXIMUM_SIZE_EXCEEDED; + else if (Status == StatAuthError) + failreason = HASHSUM_MISMATCH; + if(ErrorText.empty()) { if (Status == StatAuthError) { std::ostringstream out; - out << _("Hash Sum mismatch") << std::endl; - out << "Hashes of expected file:" << std::endl; - for (auto const &hs: GetExpectedHashes()) - out << " - " << hs.toStr() << std::endl; - out << "Hashes of received file:" << std::endl; - for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + switch (failreason) + { + case HASHSUM_MISMATCH: + out << _("Hash Sum mismatch") << std::endl; + break; + case MAXIMUM_SIZE_EXCEEDED: + case OTHER: + out << LookupTag(Message, "Message") << std::endl; + break; + } + auto const ExpectedHashes = GetExpectedHashes(); + if (ExpectedHashes.empty() == false) { - std::string const tagname = std::string(*type) + "-Hash"; - std::string const hashsum = LookupTag(Message, tagname.c_str()); - if (hashsum.empty() == false) - out << " - " << HashString(*type, hashsum).toStr() << std::endl; + out << "Hashes of expected file:" << std::endl; + for (auto const &hs: ExpectedHashes) + out << " - " << hs.toStr() << std::endl; + } + if (failreason == HASHSUM_MISMATCH) + { + out << "Hashes of received file:" << std::endl; + for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + { + std::string const tagname = std::string(*type) + "-Hash"; + std::string const hashsum = LookupTag(Message, tagname.c_str()); + if (hashsum.empty() == false) + out << " - " << HashString(*type, hashsum).toStr() << std::endl; + } + out << "Last modification reported: " << LookupTag(Message, "Last-Modified", "") << std::endl; } - out << "Last modification reported: " << LookupTag(Message, "Last-Modified", "") << std::endl; ErrorText = out.str(); } else ErrorText = LookupTag(Message,"Message"); } - string const FailReason = LookupTag(Message, "FailReason"); - if (FailReason == "MaximumSizeExceeded") - RenameOnError(MaximumSizeExceeded); - else if (Status == StatAuthError) - RenameOnError(HashSumMismatch); + switch (failreason) + { + case MAXIMUM_SIZE_EXCEEDED: RenameOnError(MaximumSizeExceeded); break; + case HASHSUM_MISMATCH: RenameOnError(HashSumMismatch); break; + case OTHER: break; + } if (FailReason.empty() == false) ReportMirrorFailureToCentral(*this, FailReason, ErrorText); @@ -800,7 +824,6 @@ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const { case HashSumMismatch: errtext = _("Hash Sum mismatch"); - Status = StatAuthError; break; case SizeMismatch: errtext = _("Size mismatch"); @@ -821,7 +844,6 @@ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const break; case MaximumSizeExceeded: // the method is expected to report a good error for this - Status = StatError; break; case PDiffError: // no handling here, done by callers @@ -1791,9 +1813,8 @@ pkgAcqBaseIndex::pkgAcqBaseIndex(pkgAcquire * const Owner, void pkgAcqBaseIndex::Failed(std::string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/ { pkgAcquire::Item::Failed(Message, Cnf); - if (TransactionManager == nullptr || ErrorText.empty() || - TransactionManager->MetaIndexParser == nullptr || - LookupTag(Message, "FailReason") != "HashSumMismatch") + if (TransactionManager == nullptr || TransactionManager->MetaIndexParser == nullptr || + Status != StatAuthError) return; ErrorText.append("Release file created at: "); diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index c009f402e..69ca6a28e 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -471,18 +471,28 @@ bool pkgAcquire::Worker::RunMessages() OwnerQ->ItemDone(Itm); Itm = nullptr; - bool errTransient; + bool errTransient = false, errAuthErr = false; { std::string const failReason = LookupTag(Message, "FailReason"); - std::string const reasons[] = { "Timeout", "ConnectionRefused", - "ConnectionTimedOut", "ResolveFailure", "TmpResolveFailure" }; - errTransient = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); + { + auto const reasons = { "Timeout", "ConnectionRefused", + "ConnectionTimedOut", "ResolveFailure", "TmpResolveFailure" }; + errTransient = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); + } + if (errTransient == false) + { + auto const reasons = { "HashSumMismatch", "MaximumSizeExceeded" }; + errAuthErr = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); + } } for (auto const Owner: ItmOwners) { - if (errTransient) + if (errAuthErr && Owner->GetExpectedHashes().empty() == false) + Owner->Status = pkgAcquire::Item::StatAuthError; + else if (errTransient) Owner->Status = pkgAcquire::Item::StatTransientNetworkError; + if (isDoomedItem(Owner) == false) Owner->Failed(Message,Config); if (Log != nullptr) -- cgit v1.2.3