summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2014-10-08 08:32:42 +0200
committerMichael Vogt <mvo@ubuntu.com>2014-10-08 08:32:42 +0200
commitf2b47ba290f3a178c584da83f007cf0f720baabb (patch)
treeea54d3dcef48843045f5b0dbebc9075b57483113
parent676700504710013d6737f79bf6ad12003d55c30d (diff)
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.
-rw-r--r--methods/server.cc16
-rw-r--r--methods/server.h4
2 files changed, 18 insertions, 2 deletions
diff --git a/methods/server.cc b/methods/server.cc
index 82f9b4750..cef809738 100644
--- a/methods/server.cc
+++ b/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);
@@ -708,3 +710,13 @@ 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;
+}
+ /*}}}*/
diff --git a/methods/server.h b/methods/server.h
index 3093e00c9..7d5198478 100644
--- a/methods/server.h
+++ b/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;