summaryrefslogtreecommitdiff
path: root/src/MultiDiskAdaptor.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-11-17 19:33:18 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-11-17 19:33:18 +0900
commit4d105a2686885d7ff682ed1bf702b81372708482 (patch)
tree0c30b8fb62ede330776923df3def60869bad4402 /src/MultiDiskAdaptor.cc
parentc4334ec57908864fed952c52c6b6416ecd40f514 (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.cc49
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;