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
pull/1/head
Tatsuhiro Tsujikawa 2008-05-27 15:07:39 +00:00
parent 27102091ad
commit 20cb017357
5 changed files with 72 additions and 63 deletions

View File

@ -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> 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 Fixed compile error on Mac OS X 10.3.9. This error was caused by the

View File

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

View File

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

View File

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

View File

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