diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-11-17 19:33:18 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-11-17 19:33:18 +0900 |
| commit | 4d105a2686885d7ff682ed1bf702b81372708482 (patch) | |
| tree | 0c30b8fb62ede330776923df3def60869bad4402 /src/MultiDiskAdaptor.cc | |
| parent | c4334ec57908864fed952c52c6b6416ecd40f514 (diff) | |
Limit number of opened file globally with --bt-max-open-files option
This change changes the behavior of --bt-max-open-files. Previously,
it specifies the maximum number of opened files for each multi-file
download. Since it is more useful to limit the number globally, the
option now specifies the global limit. This change suggests that
aria2.changeOption() method now ignores --bt-max-open-files and
aria2.changeGlobalOption now reads it and dynamically change the
limit.
Diffstat (limited to 'src/MultiDiskAdaptor.cc')
| -rw-r--r-- | src/MultiDiskAdaptor.cc | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc index 048e523b..069ff2a3 100644 --- a/src/MultiDiskAdaptor.cc +++ b/src/MultiDiskAdaptor.cc @@ -51,6 +51,7 @@ #include "LogFactory.h" #include "SimpleRandomizer.h" #include "WrDiskCacheEntry.h" +#include "RequestGroupMan.h" namespace aria2 { @@ -120,7 +121,6 @@ bool DiskWriterEntry::operator<(const DiskWriterEntry& entry) const MultiDiskAdaptor::MultiDiskAdaptor() : pieceLength_{0}, - maxOpenFiles_{DEFAULT_MAX_OPEN_FILES}, readOnly_{false} {} @@ -200,29 +200,37 @@ void MultiDiskAdaptor::resetDiskWriterEntries() } } +size_t MultiDiskAdaptor::tryCloseFile(size_t numClose) +{ + size_t left = numClose; + for(; !openedDiskWriterEntries_.empty() && left > 0; --left) { + // Choose one DiskWriterEntry randomly and close it. + size_t index = + SimpleRandomizer::getInstance()->getRandomNumber + (openedDiskWriterEntries_.size()); + auto i = std::begin(openedDiskWriterEntries_); + std::advance(i, index); + (*i)->closeFile(); + (*i) = openedDiskWriterEntries_.back(); + openedDiskWriterEntries_.pop_back(); + } + return numClose - left; +} + void MultiDiskAdaptor::openIfNot (DiskWriterEntry* entry, void (DiskWriterEntry::*open)()) { if(!entry->isOpen()) { - // A2_LOG_DEBUG(fmt("DiskWriterEntry: Cache MISS. offset=%s", - // util::itos(entry->getFileEntry()->getOffset()).c_str())); - int numOpened = openedDiskWriterEntries_.size(); - (entry->*open)(); - if(numOpened >= maxOpenFiles_) { - // Cache is full. - // Choose one DiskWriterEntry randomly and close it. - size_t index = - SimpleRandomizer::getInstance()->getRandomNumber(numOpened); - auto i = std::begin(openedDiskWriterEntries_); - std::advance(i, index); - (*i)->closeFile(); - *i = entry; - } else { - openedDiskWriterEntries_.push_back(entry); + // A2_LOG_NOTICE(fmt("DiskWriterEntry: Cache MISS. offset=%s", + // util::itos(entry->getFileEntry()->getOffset()).c_str())); + if(getRequestGroupMan()) { + getRequestGroupMan()->ensureMaxOpenFileLimit(1); } + (entry->*open)(); + openedDiskWriterEntries_.push_back(entry); } else { - // A2_LOG_DEBUG(fmt("DiskWriterEntry: Cache HIT. offset=%s", - // util::itos(entry->getFileEntry()->getOffset()).c_str())); + // A2_LOG_NOTICE(fmt("DiskWriterEntry: Cache HIT. offset=%s", + // util::itos(entry->getFileEntry()->getOffset()).c_str())); } } @@ -519,11 +527,6 @@ void MultiDiskAdaptor::cutTrailingGarbage() } } -void MultiDiskAdaptor::setMaxOpenFiles(int maxOpenFiles) -{ - maxOpenFiles_ = maxOpenFiles; -} - size_t MultiDiskAdaptor::utime(const Time& actime, const Time& modtime) { size_t numOK = 0; |
