From 1c15b5373cecac1b4391f89eccaf1c7830e36e72 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 27 Feb 2009 15:33:07 +0000 Subject: [PATCH] 2009-02-28 Tatsuhiro Tsujikawa Fixed the bug that disk writer is not created even if it shares same piece with the preceding file if the length of previous file is 0. * src/MultiDiskAdaptor.cc * test/MultiDiskAdaptorTest.cc --- ChangeLog | 8 +++++++ src/MultiDiskAdaptor.cc | 3 ++- test/MultiDiskAdaptorTest.cc | 43 +++++++++++++++++++++++++++++++----- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 15c7dfbc..4e6da4b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-02-28 Tatsuhiro Tsujikawa + + Fixed the bug that disk writer is not created even if it shares + same piece with the preceding file if the length of previous file + is 0. + * src/MultiDiskAdaptor.cc + * test/MultiDiskAdaptorTest.cc + 2009-02-23 Tatsuhiro Tsujikawa In BitTorrent, Open files in read-only mode for hash check. After diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc index bf586345..b7ab9b53 100644 --- a/src/MultiDiskAdaptor.cc +++ b/src/MultiDiskAdaptor.cc @@ -243,7 +243,8 @@ void MultiDiskAdaptor::resetDiskWriterEntries() // adjacent backward files are not needed to be allocated. They // just requre DiskWriter for(; itr != diskWriterEntries.end() && - !(*itr)->getFileEntry()->isRequested(); ++itr) { + (!(*itr)->getFileEntry()->isRequested() || + (*itr)->getFileEntry()->getLength() == 0); ++itr) { logger->debug("file=%s, offset=%lld", (*itr)->getFileEntry()->getPath().c_str(), (*itr)->getFileEntry()->getOffset()); diff --git a/test/MultiDiskAdaptorTest.cc b/test/MultiDiskAdaptorTest.cc index 71fb3228..7e6fc395 100644 --- a/test/MultiDiskAdaptorTest.cc +++ b/test/MultiDiskAdaptorTest.cc @@ -54,16 +54,22 @@ std::deque > createEntries() { SharedHandle(new FileEntry("file3.txt", 0, 22)), SharedHandle(new FileEntry("file4.txt", 2, 22)), SharedHandle(new FileEntry("file5.txt", 0, 24)), + SharedHandle(new FileEntry("file6.txt", 3, 24)), + SharedHandle(new FileEntry("file7.txt", 0, 27)), + SharedHandle(new FileEntry("file8.txt", 2, 27)), }; - // 1 1 2 2 - // 0....5....0....5....0....5 - // ++--++--++--++--++--++--++ + // 1 1 2 2 3 + // 0....5....0....5....0....5....0 + // ++--++--++--++--++--++--++--++-- // | file0 // *************** file1 // ******* file2 // | file3 // ** flie4 // | file5 + // *** file6 + // |file7 + // ** file8 std::deque > entries(&array[0], &array[arrayLength(array)]); for(std::deque >::const_iterator i = entries.begin(); @@ -192,7 +198,9 @@ void MultiDiskAdaptorTest::testResetDiskWriterEntries() } { std::deque > fileEntries = createEntries(); - fileEntries[5]->setRequested(false); + for(size_t i = 5; i < 9; ++i) { + fileEntries[i]->setRequested(false); + } adaptor->setFileEntries(fileEntries); // In openFile(), resetDiskWriterEntries() are called. adaptor->openFile(); @@ -210,7 +218,7 @@ void MultiDiskAdaptorTest::testResetDiskWriterEntries() } { std::deque > fileEntries = createEntries(); - for(size_t i = 1; i < 6; ++i) { + for(size_t i = 1; i < 9; ++i) { fileEntries[i]->setRequested(false); } adaptor->setFileEntries(fileEntries); @@ -228,7 +236,7 @@ void MultiDiskAdaptorTest::testResetDiskWriterEntries() } { std::deque > fileEntries = createEntries(); - for(size_t i = 2; i < 6; ++i) { + for(size_t i = 2; i < 9; ++i) { fileEntries[i]->setRequested(false); } adaptor->setFileEntries(fileEntries); @@ -246,6 +254,29 @@ void MultiDiskAdaptorTest::testResetDiskWriterEntries() adaptor->closeFile(); } + { + std::deque > fileEntries = createEntries(); + for(size_t i = 0; i < 6; ++i) { + fileEntries[i]->setRequested(false); + } + fileEntries[8]->setRequested(false); + adaptor->setFileEntries(fileEntries); + adaptor->openFile(); + std::deque > entries = + adaptor->getDiskWriterEntries(); + CPPUNIT_ASSERT(entries[0]->getDiskWriter().isNull()); + CPPUNIT_ASSERT(entries[1]->getDiskWriter().isNull()); + CPPUNIT_ASSERT(entries[2]->getDiskWriter().isNull()); + CPPUNIT_ASSERT(entries[3]->getDiskWriter().isNull()); + CPPUNIT_ASSERT(entries[4]->getDiskWriter().isNull()); + // entries[6] spans entries[5] in the current implementation. + CPPUNIT_ASSERT(!entries[5]->getDiskWriter().isNull()); + CPPUNIT_ASSERT(!entries[6]->getDiskWriter().isNull()); + CPPUNIT_ASSERT(!entries[7]->getDiskWriter().isNull()); + // entries[6] spans entries[8] + CPPUNIT_ASSERT(!entries[8]->getDiskWriter().isNull()); + adaptor->closeFile(); + } } void readFile(const std::string& filename, char* buf, int bufLength) {