summaryrefslogtreecommitdiff
path: root/src/OpenedFileCounter.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2014-07-30 22:31:48 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2014-07-30 22:31:48 +0900
commite74b39deaf1aeb162ac2012b48be6bf137823f5a (patch)
tree33e1ce92ad7b8c7380ccd06136576386bce73806 /src/OpenedFileCounter.cc
parentbd0a3960dfacda0c96dda0b4d0e9d88e7de800a9 (diff)
Fix crash in OpenedFileCounter::ensureMaxOpenFileLimit()
The crash happens if PieceStorage and/or DiskAdaptor are not initialized in one of active RequestGroups.
Diffstat (limited to 'src/OpenedFileCounter.cc')
-rw-r--r--src/OpenedFileCounter.cc24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/OpenedFileCounter.cc b/src/OpenedFileCounter.cc
index c5bdeade..efdf8368 100644
--- a/src/OpenedFileCounter.cc
+++ b/src/OpenedFileCounter.cc
@@ -71,12 +71,32 @@ void OpenedFileCounter::ensureMaxOpenFileLimit(size_t numNewFiles)
std::advance(mark,
SimpleRandomizer::getInstance()->
getRandomNumber(requestGroups.size()));
+
+ auto closeFun = [&left](const std::shared_ptr<RequestGroup>& group)
+ {
+ auto& ps = group->getPieceStorage();
+
+ if(!ps) {
+ return;
+ }
+
+ auto diskAdaptor = ps->getDiskAdaptor();
+
+ if(!diskAdaptor) {
+ return;
+ }
+
+ left -= diskAdaptor->tryCloseFile(left);
+ };
+
for(auto i = mark; i != std::end(requestGroups) && left > 0; ++i) {
- left -= (*i)->getPieceStorage()->getDiskAdaptor()->tryCloseFile(left);
+ closeFun(*i);
}
+
for(auto i = std::begin(requestGroups); i != mark && left > 0; ++i) {
- left -= (*i)->getPieceStorage()->getDiskAdaptor()->tryCloseFile(left);
+ closeFun(*i);
}
+
assert(left == 0);
numOpenFiles_ += numNewFiles - numClose;
}