ソースを参照

2008-05-28 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Refactored broken outstanding piece handling.
	* src/DefaultPieceStorage.cc
	* src/DefaultPieceStorage.h
	* src/Piece.cc
	* src/Piece.h
Tatsuhiro Tsujikawa 17 年 前
コミット
20cb017357
5 ファイル変更73 行追加64 行削除
  1. 8 0
      ChangeLog
  2. 56 62
      src/DefaultPieceStorage.cc
  3. 2 2
      src/DefaultPieceStorage.h
  4. 5 0
      src/Piece.cc
  5. 2 0
      src/Piece.h

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2008-05-28  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Refactored broken outstanding piece handling.
+	* src/DefaultPieceStorage.cc
+	* src/DefaultPieceStorage.h
+	* src/Piece.cc
+	* src/Piece.h
+
 2008-05-27  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Fixed compile error on Mac OS X 10.3.9. This error was caused by the

+ 56 - 62
src/DefaultPieceStorage.cc

@@ -143,29 +143,24 @@ PieceHandle DefaultPieceStorage::getPiece(size_t index)
 
 void DefaultPieceStorage::addUsedPiece(const PieceHandle& piece)
 {
-  usedPieces.push_back(piece);
+  std::deque<SharedHandle<Piece> >::iterator i =
+    std::lower_bound(usedPieces.begin(), usedPieces.end(), piece);
+  usedPieces.insert(i, piece);
+  logger->debug("usedPieces.size()=%zu", usedPieces.size());
 }
 
-class FindPiece {
-private:
-  size_t index;
-public:
-  FindPiece(size_t index):index(index) {}
-
-  bool operator()(const PieceHandle& piece) {
-    return piece->getIndex() == index;
-  }
-};
-
 PieceHandle DefaultPieceStorage::findUsedPiece(size_t index) const
 {
-  Pieces::const_iterator itr = std::find_if(usedPieces.begin(),
-					    usedPieces.end(),
-					    FindPiece(index));
-  if(itr == usedPieces.end()) {
-    return SharedHandle<Piece>();
+  SharedHandle<Piece> p(new Piece());
+  p->setIndex(index);
+
+  std::deque<SharedHandle<Piece> >::const_iterator i =
+    std::lower_bound(usedPieces.begin(), usedPieces.end(), p);
+  if(i != usedPieces.end() && (*i) == p) {
+    return *i;
   } else {
-    return *itr;
+    p.reset(0);
+    return p;
   }
 }
 
@@ -237,50 +232,48 @@ void DefaultPieceStorage::deleteUsedPiece(const PieceHandle& piece)
   if(piece.isNull()) {
     return;
   }
-  Pieces::iterator itr = std::find(usedPieces.begin(), usedPieces.end(), piece);
-  if(itr != usedPieces.end()) {
-    usedPieces.erase(itr);
+  std::deque<SharedHandle<Piece> >::iterator i = 
+    std::lower_bound(usedPieces.begin(), usedPieces.end(), piece);
+  if(i != usedPieces.end() && (*i) == piece) {
+    usedPieces.erase(i);
   }
 }
 
-void DefaultPieceStorage::reduceUsedPieces(size_t delMax)
-{
-  if(usedPieces.size() <= delMax) {
-    return;
-  }
-  size_t toDelete = usedPieces.size()-delMax;
-  int fillRate = 10;
-  while(fillRate < 50) {
-    size_t deleted = deleteUsedPiecesByFillRate(fillRate, toDelete);
-    if(deleted == 0) {
-      break;
-    }
-    toDelete -= deleted;
-    fillRate += 10;
-  }
-}
-
-size_t DefaultPieceStorage::deleteUsedPiecesByFillRate(int fillRate,
-						       size_t toDelete)
-{
-  size_t deleted = 0;
-  for(Pieces::iterator itr = usedPieces.begin();
-      itr != usedPieces.end() && deleted < toDelete;) {
-    PieceHandle& piece = *itr;
-    if(!bitfieldMan->isUseBitSet(piece->getIndex()) &&
-       piece->countCompleteBlock() <= piece->countBlock()*(fillRate/100.0)) {
-      logger->debug(MSG_DELETING_USED_PIECE,
-		    piece->getIndex(),
-		    (piece->countCompleteBlock()*100)/piece->countBlock(),
-		    fillRate);
-      itr = usedPieces.erase(itr);
-      deleted++;
-    } else {
-      itr++;
-    }
-  }
-  return deleted;
-}
+// void DefaultPieceStorage::reduceUsedPieces(size_t upperBound)
+// {
+//   size_t usedPiecesSize = usedPieces.size();
+//   if(usedPiecesSize <= upperBound) {
+//     return;
+//   }
+//   size_t delNum = usedPiecesSize-upperBound;
+//   int fillRate = 10;
+//   while(delNum && fillRate <= 15) {
+//     delNum -= deleteUsedPiecesByFillRate(fillRate, delNum);
+//     fillRate += 5;
+//   }
+// }
+
+// size_t DefaultPieceStorage::deleteUsedPiecesByFillRate(int fillRate,
+// 						       size_t delNum)
+// {
+//   size_t deleted = 0;
+//   for(Pieces::iterator itr = usedPieces.begin();
+//       itr != usedPieces.end() && deleted < delNum;) {
+//     PieceHandle& piece = *itr;
+//     if(!bitfieldMan->isUseBitSet(piece->getIndex()) &&
+//        piece->countCompleteBlock() <= piece->countBlock()*(fillRate/100.0)) {
+//       logger->info(MSG_DELETING_USED_PIECE,
+// 		    piece->getIndex(),
+// 		    (piece->countCompleteBlock()*100)/piece->countBlock(),
+// 		    fillRate);
+//       itr = usedPieces.erase(itr);
+//       ++deleted;
+//     } else {
+//       ++itr;
+//     }
+//   }
+//   return deleted;
+// }
 
 void DefaultPieceStorage::completePiece(const PieceHandle& piece)
 {
@@ -288,9 +281,9 @@ void DefaultPieceStorage::completePiece(const PieceHandle& piece)
     return;
   }
   deleteUsedPiece(piece);
-  if(!isEndGame()) {
-    reduceUsedPieces(100);
-  }
+//   if(!isEndGame()) {
+//     reduceUsedPieces(100);
+//   }
   if(allDownloadFinished()) {
     return;
   }
@@ -571,6 +564,7 @@ void DefaultPieceStorage::markPieceMissing(size_t index)
 void DefaultPieceStorage::addInFlightPiece(const Pieces& pieces)
 {
   usedPieces.insert(usedPieces.end(), pieces.begin(), pieces.end());
+  std::sort(usedPieces.begin(), usedPieces.end());
 }
 
 size_t DefaultPieceStorage::countInFlightPiece()

+ 2 - 2
src/DefaultPieceStorage.h

@@ -86,8 +86,8 @@ private:
   bool getMissingPieceIndex(size_t& index, const SharedHandle<Peer>& peer);
   bool getMissingFastPieceIndex(size_t& index, const SharedHandle<Peer>& peer);
   SharedHandle<Piece> checkOutPiece(size_t index);
-  size_t deleteUsedPiecesByFillRate(int fillRate, size_t toDelete);
-  void reduceUsedPieces(size_t delMax);
+//   size_t deleteUsedPiecesByFillRate(int fillRate, size_t toDelete);
+//   void reduceUsedPieces(size_t upperBound);
   void deleteUsedPiece(const SharedHandle<Piece>& piece);
   SharedHandle<Piece> findUsedPiece(size_t index) const;
 

+ 5 - 0
src/Piece.cc

@@ -82,6 +82,11 @@ bool Piece::operator==(const Piece& piece) const
   return index == piece.index;
 }
 
+bool Piece::operator<(const Piece& piece) const
+{
+  return index < piece.index;
+}
+
 void Piece::completeBlock(size_t blockIndex) {
   bitfield->setBit(blockIndex);
   bitfield->unsetUseBit(blockIndex);

+ 2 - 0
src/Piece.h

@@ -67,6 +67,8 @@ public:
   
   bool operator==(const Piece& piece) const;
 
+  bool operator<(const Piece& piece) const;
+
   bool getMissingUnusedBlockIndex(size_t& index) const;
   bool getMissingBlockIndex(size_t& index) const;
   bool getFirstMissingBlockIndexWithoutLock(size_t& index) const;