2009-02-28 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

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
pull/1/head
Tatsuhiro Tsujikawa 2009-02-27 15:33:07 +00:00
parent 2dfee3dc49
commit 1c15b5373c
3 changed files with 47 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2009-02-28 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
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 <t-tujikawa@users.sourceforge.net>
In BitTorrent, Open files in read-only mode for hash check. After

View File

@ -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());

View File

@ -54,16 +54,22 @@ std::deque<SharedHandle<FileEntry> > createEntries() {
SharedHandle<FileEntry>(new FileEntry("file3.txt", 0, 22)),
SharedHandle<FileEntry>(new FileEntry("file4.txt", 2, 22)),
SharedHandle<FileEntry>(new FileEntry("file5.txt", 0, 24)),
SharedHandle<FileEntry>(new FileEntry("file6.txt", 3, 24)),
SharedHandle<FileEntry>(new FileEntry("file7.txt", 0, 27)),
SharedHandle<FileEntry>(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<SharedHandle<FileEntry> > entries(&array[0],
&array[arrayLength(array)]);
for(std::deque<SharedHandle<FileEntry> >::const_iterator i = entries.begin();
@ -192,7 +198,9 @@ void MultiDiskAdaptorTest::testResetDiskWriterEntries()
}
{
std::deque<SharedHandle<FileEntry> > 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<SharedHandle<FileEntry> > 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<SharedHandle<FileEntry> > 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<SharedHandle<FileEntry> > 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<SharedHandle<DiskWriterEntry> > 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) {