diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2014-07-30 22:31:48 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2014-07-30 22:31:48 +0900 |
| commit | e74b39deaf1aeb162ac2012b48be6bf137823f5a (patch) | |
| tree | 33e1ce92ad7b8c7380ccd06136576386bce73806 /src/OpenedFileCounter.cc | |
| parent | bd0a3960dfacda0c96dda0b4d0e9d88e7de800a9 (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.cc | 24 |
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; } |
