]> git.saurik.com Git - apt.git/commitdiff
Fix http pipeline messup detection
authorMichael Vogt <mvo@ubuntu.com>
Wed, 8 Oct 2014 06:32:42 +0000 (08:32 +0200)
committerMichael Vogt <mvo@ubuntu.com>
Wed, 8 Oct 2014 06:32:42 +0000 (08:32 +0200)
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.

methods/server.cc
methods/server.h

index 82f9b4750b835fc72fb5bbe421e7b82fec5a0ef2..cef8097384526b5f430480196971a854ef45c44d 100644 (file)
@@ -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;
 }
                                                                        /*}}}*/
index 3093e00c99ba44f0218f12d3a0b0826b830f911f..7d519847898ac71a875ce7688e1f2daf4d00df49 100644 (file)
@@ -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;