Переглянути джерело

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
Tatsuhiro Tsujikawa 16 роки тому
батько
коміт
1c15b5373c
3 змінених файлів з 47 додано та 7 видалено
  1. 8 0
      ChangeLog
  2. 2 1
      src/MultiDiskAdaptor.cc
  3. 37 6
      test/MultiDiskAdaptorTest.cc

+ 8 - 0
ChangeLog

@@ -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

+ 2 - 1
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());

+ 37 - 6
test/MultiDiskAdaptorTest.cc

@@ -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) {