2010-07-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Use hostname of original URI when counting hostname in
	inFlightRequest.
	* src/FileEntry.cc
pull/1/head
Tatsuhiro Tsujikawa 2010-07-31 14:02:24 +00:00
parent 4280650e29
commit 3a0f45ec8d
2 changed files with 32 additions and 18 deletions

View File

@ -1,3 +1,16 @@
2010-07-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Use hostname of original URI when counting hostname in
inFlightRequest.
* src/FileEntry.cc
2010-07-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that
AdaptiveFileAllocationIterator::getCurrentLength() does not return
updated allocated bytes.
* src/AdaptiveFileAllocationIterator.h
2010-07-30 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2010-07-30 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added FTP EPSV and EPRT command support. aria2 issues these Added FTP EPSV and EPRT command support. aria2 issues these

View File

@ -103,19 +103,17 @@ void FileEntry::getUris(std::vector<std::string>& uris) const
uris.insert(uris.end(), uris_.begin(), uris_.end()); uris.insert(uris.end(), uris_.begin(), uris_.end());
} }
template<typename InputIterator> template<typename InputIterator, typename OutputIterator>
static size_t countInFlightHost(InputIterator first, InputIterator last, static OutputIterator
const std::string& hostname) enumerateInFlightHosts
(InputIterator first, InputIterator last, OutputIterator out)
{ {
// TODO redirection should be considered here. We need to parse Request r;
// original URI to get hostname.
size_t count = 0;
for(; first != last; ++first) { for(; first != last; ++first) {
if((*first)->getHost() == hostname) { r.setUri((*first)->getUri());
++count; *out++ = r.getHost();
} }
} return out;
return count;
} }
SharedHandle<Request> SharedHandle<Request>
@ -128,6 +126,10 @@ FileEntry::getRequest
{ {
SharedHandle<Request> req; SharedHandle<Request> req;
Request r; Request r;
std::vector<std::string> inFlightHosts;
enumerateInFlightHosts(inFlightRequests_.begin(), inFlightRequests_.end(),
std::back_inserter(inFlightHosts));
if(!requestPool_.empty()) { if(!requestPool_.empty()) {
for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(), for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(),
eoi = requestPool_.end(); i != eoi; ++i) { eoi = requestPool_.end(); i != eoi; ++i) {
@ -136,8 +138,8 @@ FileEntry::getRequest
usedHosts.end()) { usedHosts.end()) {
continue; continue;
} }
if(countInFlightHost(inFlightRequests_.begin(), inFlightRequests_.end(), if(std::count(inFlightHosts.begin(), inFlightHosts.end(), r.getHost())
r.getHost()) >= maxConnectionPerServer_) { >= static_cast<int>(maxConnectionPerServer_)) {
continue; continue;
} }
req = *i; req = *i;
@ -157,9 +159,8 @@ FileEntry::getRequest
} }
req.reset(new Request()); req.reset(new Request());
if(req->setUri(uri)) { if(req->setUri(uri)) {
if(countInFlightHost(inFlightRequests_.begin(), if(std::count(inFlightHosts.begin(), inFlightHosts.end(),req->getHost())
inFlightRequests_.end(), >= static_cast<int>(maxConnectionPerServer_)) {
req->getHost()) >= maxConnectionPerServer_) {
pending.push_back(uri); pending.push_back(uri);
ignoreHost.push_back(req->getHost()); ignoreHost.push_back(req->getHost());
req.reset(); req.reset();
@ -188,8 +189,8 @@ FileEntry::getRequest
for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(), for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(),
eoi = requestPool_.end(); i != eoi; ++i) { eoi = requestPool_.end(); i != eoi; ++i) {
r.setUri((*i)->getUri()); r.setUri((*i)->getUri());
if(countInFlightHost(inFlightRequests_.begin(), inFlightRequests_.end(), if(std::count(inFlightHosts.begin(), inFlightHosts.end(), r.getHost())
r.getHost()) >= maxConnectionPerServer_) { >= static_cast<int>(maxConnectionPerServer_)) {
continue; continue;
} }
req = *i; req = *i;