mirror of https://github.com/aria2/aria2
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.hpull/1/head
parent
27102091ad
commit
20cb017357
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
// 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 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;
|
||||
}
|
||||
// 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()
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue