summaryrefslogtreecommitdiff
path: root/methods/server.cc
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2014-10-08 08:37:01 +0200
committerMichael Vogt <mvo@ubuntu.com>2014-10-08 08:37:01 +0200
commit0c158e03ceb509a08d3d4ded79c3151237f669dd (patch)
treedc7a5cf8f15a7907d00beb75b5fa4d246ec3d36a /methods/server.cc
parenta943fbf21ca0b9b58b8f1492fc518679b1d7c749 (diff)
parentf2b47ba290f3a178c584da83f007cf0f720baabb (diff)
Merge remote-tracking branch 'mvo/feature/expected-size' into debian/experimental
Diffstat (limited to 'methods/server.cc')
-rw-r--r--methods/server.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/methods/server.cc b/methods/server.cc
index 4a961f454..cef809738 100644
--- a/methods/server.cc
+++ b/methods/server.cc
@@ -532,6 +532,13 @@ int ServerMethod::Loop()
// Run the data
bool Result = true;
+
+ // ensure we don't fetch too much
+ // 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);
@@ -605,7 +612,10 @@ int ServerMethod::Loop()
QueueBack = Queue;
}
else
+ {
+ Server->Close();
Fail(true);
+ }
}
break;
}
@@ -700,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;
+}
+ /*}}}*/