|
@@ -269,6 +269,42 @@ void pkgAcquire::Remove(Worker *Work)
|
|
|
it is constructed which creates a queue (based on the current queue
|
|
it is constructed which creates a queue (based on the current queue
|
|
|
mode) and puts the item in that queue. If the system is running then
|
|
mode) and puts the item in that queue. If the system is running then
|
|
|
the queue might be started. */
|
|
the queue might be started. */
|
|
|
|
|
+static bool DoesAcquireResultInInstantFailure(pkgAcquire::Item * const Item,
|
|
|
|
|
+ pkgAcquire::MethodConfig const * const Config, pkgAcquireStatus * const Log)
|
|
|
|
|
+{
|
|
|
|
|
+ auto SavedDesc = Item->GetItemDesc();
|
|
|
|
|
+ if (Item->IsRedirectionLoop(SavedDesc.URI))
|
|
|
|
|
+ {
|
|
|
|
|
+ std::string const Message = "400 URI Failure"
|
|
|
|
|
+ "\nURI: " + SavedDesc.URI +
|
|
|
|
|
+ "\nFilename: " + Item->DestFile +
|
|
|
|
|
+ "\nFailReason: RedirectionLoop";
|
|
|
|
|
+
|
|
|
|
|
+ Item->Status = pkgAcquire::Item::StatError;
|
|
|
|
|
+ Item->Failed(Message, Config);
|
|
|
|
|
+ if (Log != nullptr)
|
|
|
|
|
+ Log->Fail(SavedDesc);
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ HashStringList const hsl = Item->GetExpectedHashes();
|
|
|
|
|
+ if (hsl.usable() == false && Item->HashesRequired() &&
|
|
|
|
|
+ _config->Exists("Acquire::ForceHash") == false)
|
|
|
|
|
+ {
|
|
|
|
|
+ std::string const Message = "400 URI Failure"
|
|
|
|
|
+ "\nURI: " + SavedDesc.URI +
|
|
|
|
|
+ "\nFilename: " + Item->DestFile +
|
|
|
|
|
+ "\nFailReason: WeakHashSums";
|
|
|
|
|
+
|
|
|
|
|
+ auto SavedDesc = Item->GetItemDesc();
|
|
|
|
|
+ Item->Status = pkgAcquire::Item::StatAuthError;
|
|
|
|
|
+ Item->Failed(Message, Config);
|
|
|
|
|
+ if (Log != nullptr)
|
|
|
|
|
+ Log->Fail(SavedDesc);
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+}
|
|
|
void pkgAcquire::Enqueue(ItemDesc &Item)
|
|
void pkgAcquire::Enqueue(ItemDesc &Item)
|
|
|
{
|
|
{
|
|
|
// Determine which queue to put the item in
|
|
// Determine which queue to put the item in
|
|
@@ -277,6 +313,13 @@ void pkgAcquire::Enqueue(ItemDesc &Item)
|
|
|
if (Name.empty() == true)
|
|
if (Name.empty() == true)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
|
|
+ /* the check for running avoids that we produce errors
|
|
|
|
|
+ in logging before we actually have started, which would
|
|
|
|
|
+ be easier to implement but would confuse users/implementations
|
|
|
|
|
+ so we check the items skipped here in #Startup */
|
|
|
|
|
+ if (Running && DoesAcquireResultInInstantFailure(Item.Owner, Config, Log))
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
// Find the queue structure
|
|
// Find the queue structure
|
|
|
Queue *I = Queues;
|
|
Queue *I = Queues;
|
|
|
for (; I != 0 && I->Name != Name; I = I->Next);
|
|
for (; I != 0 && I->Name != Name; I = I->Next);
|
|
@@ -912,10 +955,20 @@ bool pkgAcquire::Queue::Startup()
|
|
|
if (Workers == 0)
|
|
if (Workers == 0)
|
|
|
{
|
|
{
|
|
|
URI U(Name);
|
|
URI U(Name);
|
|
|
- pkgAcquire::MethodConfig *Cnf = Owner->GetConfig(U.Access);
|
|
|
|
|
- if (Cnf == 0)
|
|
|
|
|
|
|
+ pkgAcquire::MethodConfig * const Cnf = Owner->GetConfig(U.Access);
|
|
|
|
|
+ if (unlikely(Cnf == nullptr))
|
|
|
return false;
|
|
return false;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // now-running twin of the pkgAcquire::Enqueue call
|
|
|
|
|
+ for (QItem *I = Items; I != 0; )
|
|
|
|
|
+ {
|
|
|
|
|
+ bool pointless = false;
|
|
|
|
|
+ for (auto &&O: I->Owners)
|
|
|
|
|
+ if (DoesAcquireResultInInstantFailure(O, Cnf, Owner->Log))
|
|
|
|
|
+ pointless = true;
|
|
|
|
|
+ I = pointless ? Items : I->Next;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Workers = new Worker(this,Cnf,Owner->Log);
|
|
Workers = new Worker(this,Cnf,Owner->Log);
|
|
|
Owner->Add(Workers);
|
|
Owner->Add(Workers);
|
|
|
if (Workers->Start() == false)
|
|
if (Workers->Start() == false)
|