Explorar o código

Fix http pipeline messup detection

The Maximum-Size protection breaks the http pipeline reorder code
because it relies on that the object got fetched entirely so that
it can compare the hash of the downloaded data. So instead of
stopping when the Maximum-Size of the expected item is reached we
only stop when the maximum size of the biggest item in the queue
is reached. This way the pipeline reoder code keeps working.
Michael Vogt %!s(int64=11) %!d(string=hai) anos
pai
achega
f2b47ba290
Modificáronse 2 ficheiros con 18 adicións e 2 borrados
  1. 14 2
      methods/server.cc
  2. 4 0
      methods/server.h

+ 14 - 2
methods/server.cc

@@ -534,8 +534,10 @@ int ServerMethod::Loop()
 	    bool Result = true;
 
             // ensure we don't fetch too much
-            if (Queue->MaximumSize > 0)
-               Server->MaximumSize = Queue->MaximumSize;
+            // we could do "Server->MaximumSize = Queue->MaximumSize" here
+            // but that would break the clever pipeline messup detection
+            // so instead we use the size of the biggest item in the queue
+            Server->MaximumSize = FindMaximumObjectSizeInQueue();
 
             if (Server->HaveContent)
 	       Result = Server->RunData(File);
@@ -706,5 +708,15 @@ int ServerMethod::Loop()
    }
    
    return 0;
+}
+									/*}}}*/
+                         						/*{{{*/
+unsigned long long
+ServerMethod::FindMaximumObjectSizeInQueue() const 
+{
+   unsigned long long MaxSizeInQueue = 0;
+   for (FetchItem *I = Queue->Next; I != 0 && I != QueueBack; I = I->Next)
+      MaxSizeInQueue = std::max(MaxSizeInQueue, I->MaximumSize);
+   return MaxSizeInQueue;
 }
 									/*}}}*/

+ 4 - 0
methods/server.h

@@ -106,6 +106,10 @@ class ServerMethod : public pkgAcqMethod
    unsigned long PipelineDepth;
    bool AllowRedirect;
 
+   // Find the biggest item in the fetch queue for the checking of the maximum
+   // size
+   unsigned long long FindMaximumObjectSizeInQueue() const APT_PURE;
+
    public:
    bool Debug;