mirror of https://github.com/aria2/aria2
2009-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Made URI reusing function work. * src/CreateRequestCommand.cc * src/FileEntry.cc * src/FileEntry.h * test/FileEntryTest.ccpull/1/head
parent
3a655a5d1a
commit
a7c222b8ab
|
@ -1,3 +1,11 @@
|
||||||
|
2009-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
Made URI reusing function work.
|
||||||
|
* src/CreateRequestCommand.cc
|
||||||
|
* src/FileEntry.cc
|
||||||
|
* src/FileEntry.h
|
||||||
|
* test/FileEntryTest.cc
|
||||||
|
|
||||||
2009-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2009-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Add formerly fastest PeerStat's sessionDownloadLength to new
|
Add formerly fastest PeerStat's sessionDownloadLength to new
|
||||||
|
|
|
@ -67,6 +67,10 @@ bool CreateRequestCommand::executeInternal()
|
||||||
_fileEntry = _requestGroup->getDownloadContext()->findFileEntryByOffset
|
_fileEntry = _requestGroup->getDownloadContext()->findFileEntryByOffset
|
||||||
(_segments.front()->getPositionToWrite());
|
(_segments.front()->getPositionToWrite());
|
||||||
}
|
}
|
||||||
|
if(_fileEntry->getRemainingUris().empty() &&
|
||||||
|
getOption()->getAsBool(PREF_REUSE_URI)) {
|
||||||
|
_fileEntry->reuseUri(_requestGroup->getNumConcurrentCommand());
|
||||||
|
}
|
||||||
req = _fileEntry->getRequest(_requestGroup->getURISelector(),
|
req = _fileEntry->getRequest(_requestGroup->getURISelector(),
|
||||||
getOption()->get(PREF_REFERER),
|
getOption()->get(PREF_REFERER),
|
||||||
// Don't use HEAD request when file
|
// Don't use HEAD request when file
|
||||||
|
|
|
@ -278,4 +278,39 @@ void FileEntry::extractURIResult
|
||||||
_uriResults.erase(_uriResults.begin(), i);
|
_uriResults.erase(_uriResults.begin(), i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileEntry::reuseUri(size_t num)
|
||||||
|
{
|
||||||
|
std::deque<std::string> uris = _spentUris;
|
||||||
|
std::sort(uris.begin(), uris.end());
|
||||||
|
uris.erase(std::unique(uris.begin(), uris.end()), uris.end());
|
||||||
|
|
||||||
|
std::deque<std::string> errorUris(_uriResults.size());
|
||||||
|
std::transform(_uriResults.begin(), _uriResults.end(),
|
||||||
|
errorUris.begin(), std::mem_fun_ref(&URIResult::getURI));
|
||||||
|
std::sort(errorUris.begin(), errorUris.end());
|
||||||
|
errorUris.erase(std::unique(errorUris.begin(), errorUris.end()),
|
||||||
|
errorUris.end());
|
||||||
|
|
||||||
|
std::deque<std::string> reusableURIs;
|
||||||
|
std::set_difference(uris.begin(), uris.end(),
|
||||||
|
errorUris.begin(), errorUris.end(),
|
||||||
|
std::back_inserter(reusableURIs));
|
||||||
|
size_t ininum = reusableURIs.size();
|
||||||
|
_logger->debug("Found %u reusable URIs",
|
||||||
|
static_cast<unsigned int>(ininum));
|
||||||
|
// Reuse at least num URIs here to avoid to
|
||||||
|
// run this process repeatedly.
|
||||||
|
if(ininum > 0 && ininum < num) {
|
||||||
|
_logger->debug("fewer than num=%u",
|
||||||
|
num);
|
||||||
|
for(size_t i = 0; i < num/ininum; ++i) {
|
||||||
|
_uris.insert(_uris.end(), reusableURIs.begin(), reusableURIs.end());
|
||||||
|
}
|
||||||
|
_uris.insert(_uris.end(), reusableURIs.begin(),
|
||||||
|
reusableURIs.begin()+(num%ininum));
|
||||||
|
_logger->debug("Duplication complete: now %u URIs for reuse",
|
||||||
|
static_cast<unsigned int>(_uris.size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -225,6 +225,12 @@ public:
|
||||||
{
|
{
|
||||||
return _singleHostMultiConnection;
|
return _singleHostMultiConnection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reuse URIs which have not emitted error so far. Thie method
|
||||||
|
// tries to reuse at least num URIs. If less than num URIs found to
|
||||||
|
// reuse, those URIs are used more than once so that num URIs total
|
||||||
|
// are available to reuse.
|
||||||
|
void reuseUri(size_t num);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SharedHandle<FileEntry> FileEntryHandle;
|
typedef SharedHandle<FileEntry> FileEntryHandle;
|
||||||
|
|
|
@ -14,6 +14,7 @@ class FileEntryTest : public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testExtractURIResult);
|
CPPUNIT_TEST(testExtractURIResult);
|
||||||
CPPUNIT_TEST(testGetRequest);
|
CPPUNIT_TEST(testGetRequest);
|
||||||
CPPUNIT_TEST(testGetRequest_disableSingleHostMultiConnection);
|
CPPUNIT_TEST(testGetRequest_disableSingleHostMultiConnection);
|
||||||
|
CPPUNIT_TEST(testReuseUri);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
public:
|
public:
|
||||||
void setUp() {}
|
void setUp() {}
|
||||||
|
@ -23,6 +24,7 @@ public:
|
||||||
void testExtractURIResult();
|
void testExtractURIResult();
|
||||||
void testGetRequest();
|
void testGetRequest();
|
||||||
void testGetRequest_disableSingleHostMultiConnection();
|
void testGetRequest_disableSingleHostMultiConnection();
|
||||||
|
void testReuseUri();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -128,4 +130,23 @@ void FileEntryTest::testGetRequest_disableSingleHostMultiConnection()
|
||||||
CPPUNIT_ASSERT(req3rd.isNull());
|
CPPUNIT_ASSERT(req3rd.isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileEntryTest::testReuseUri()
|
||||||
|
{
|
||||||
|
SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
|
||||||
|
SharedHandle<FileEntry> fileEntry = createFileEntry();
|
||||||
|
size_t numUris = fileEntry->getRemainingUris().size();
|
||||||
|
for(size_t i = 0; i < numUris; ++i) {
|
||||||
|
fileEntry->getRequest(selector);
|
||||||
|
}
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size());
|
||||||
|
fileEntry->addURIResult("http://localhost/aria2.zip",
|
||||||
|
downloadresultcode::UNKNOWN_ERROR);
|
||||||
|
fileEntry->reuseUri(3);
|
||||||
|
CPPUNIT_ASSERT_EQUAL((size_t)3, fileEntry->getRemainingUris().size());
|
||||||
|
const std::deque<std::string>& uris = fileEntry->getRemainingUris();
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]);
|
||||||
|
CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[2]);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue