|
@@ -151,42 +151,6 @@ SegmentHandle SegmentMan::checkoutSegment(cuid_t cuid,
|
|
|
return segment;
|
|
|
}
|
|
|
|
|
|
-SegmentEntryHandle SegmentMan::findSlowerSegmentEntry
|
|
|
-(const PeerStatHandle& peerStat)
|
|
|
-{
|
|
|
- unsigned int speed =
|
|
|
- static_cast<unsigned int>(peerStat->getAvgDownloadSpeed()*0.8);
|
|
|
- SegmentEntryHandle slowSegmentEntry;
|
|
|
- int startupIdleTime = _option->getAsInt(PREF_STARTUP_IDLE_TIME);
|
|
|
- for(std::deque<SharedHandle<SegmentEntry> >::const_iterator itr =
|
|
|
- usedSegmentEntries.begin(); itr != usedSegmentEntries.end(); ++itr) {
|
|
|
- const SharedHandle<SegmentEntry>& segmentEntry = *itr;
|
|
|
- if(segmentEntry->cuid == 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- SharedHandle<PeerStat> p = getPeerStat(segmentEntry->cuid);
|
|
|
- if(p.isNull()) {
|
|
|
- // "p is null" means that it hasn't used DownloadCommand yet, i.e. waiting
|
|
|
- // response from HTTP server after sending HTTP request.
|
|
|
- p.reset(new PeerStat(segmentEntry->cuid));
|
|
|
- registerPeerStat(p);
|
|
|
- slowSegmentEntry = segmentEntry;
|
|
|
- } else {
|
|
|
- if(p->getCuid() == peerStat->getCuid() ||
|
|
|
- (p->getStatus() == PeerStat::ACTIVE &&
|
|
|
- !p->getDownloadStartTime().elapsed(startupIdleTime))) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- unsigned int pSpeed = p->calculateDownloadSpeed();
|
|
|
- if(pSpeed < speed) {
|
|
|
- speed = pSpeed;
|
|
|
- slowSegmentEntry = segmentEntry;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return slowSegmentEntry;
|
|
|
-}
|
|
|
-
|
|
|
void SegmentMan::getInFlightSegment(std::deque<SharedHandle<Segment> >& segments,
|
|
|
cuid_t cuid)
|
|
|
{
|
|
@@ -203,32 +167,7 @@ SegmentHandle SegmentMan::getSegment(cuid_t cuid) {
|
|
|
PieceHandle piece =
|
|
|
_pieceStorage->getSparseMissingUnusedPiece
|
|
|
(_ignoreBitfield.getFilterBitfield(),_ignoreBitfield.getBitfieldLength());
|
|
|
- if(piece.isNull()) {
|
|
|
- PeerStatHandle myPeerStat = getPeerStat(cuid);
|
|
|
- if(myPeerStat.isNull()) {
|
|
|
- return SharedHandle<Segment>();
|
|
|
- }
|
|
|
- SegmentEntryHandle slowSegmentEntry = findSlowerSegmentEntry(myPeerStat);
|
|
|
- if(slowSegmentEntry.get()) {
|
|
|
- logger->info(MSG_SEGMENT_FORWARDING,
|
|
|
- slowSegmentEntry->cuid,
|
|
|
- slowSegmentEntry->segment->getIndex(),
|
|
|
- cuid);
|
|
|
- PeerStatHandle slowPeerStat = getPeerStat(slowSegmentEntry->cuid);
|
|
|
- slowPeerStat->requestIdle();
|
|
|
- cancelSegment(slowSegmentEntry->cuid);
|
|
|
-
|
|
|
- SharedHandle<Piece> piece =
|
|
|
- _pieceStorage->getMissingPiece(slowSegmentEntry->segment->getIndex());
|
|
|
- assert(!piece.isNull());
|
|
|
-
|
|
|
- return checkoutSegment(cuid, piece);
|
|
|
- } else {
|
|
|
- return SharedHandle<Segment>();
|
|
|
- }
|
|
|
- } else {
|
|
|
- return checkoutSegment(cuid, piece);
|
|
|
- }
|
|
|
+ return checkoutSegment(cuid, piece);
|
|
|
}
|
|
|
|
|
|
SegmentHandle SegmentMan::getSegment(cuid_t cuid, size_t index) {
|
|
@@ -293,36 +232,9 @@ uint64_t SegmentMan::getDownloadLength() const {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-class FindPeerStat {
|
|
|
-public:
|
|
|
- bool operator()(const SharedHandle<PeerStat>& peerStat, cuid_t cuid) const
|
|
|
- {
|
|
|
- return peerStat->getCuid() < cuid;
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-bool SegmentMan::registerPeerStat(const SharedHandle<PeerStat>& peerStat)
|
|
|
-{
|
|
|
- std::deque<SharedHandle<PeerStat> >::iterator i =
|
|
|
- std::lower_bound(peerStats.begin(), peerStats.end(),peerStat->getCuid(),
|
|
|
- FindPeerStat());
|
|
|
- if(i == peerStats.end() || (*i)->getCuid() != peerStat->getCuid()) {
|
|
|
- peerStats.insert(i, peerStat);
|
|
|
- return true ;
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-PeerStatHandle SegmentMan::getPeerStat(cuid_t cuid) const
|
|
|
+void SegmentMan::registerPeerStat(const SharedHandle<PeerStat>& peerStat)
|
|
|
{
|
|
|
- std::deque<SharedHandle<PeerStat> >::const_iterator i =
|
|
|
- std::lower_bound(peerStats.begin(), peerStats.end(), cuid, FindPeerStat());
|
|
|
- if(i != peerStats.end() && (*i)->getCuid() == cuid) {
|
|
|
- return *i;
|
|
|
- } else {
|
|
|
- return SharedHandle<PeerStat>();
|
|
|
- }
|
|
|
+ peerStats.push_back(peerStat);
|
|
|
}
|
|
|
|
|
|
unsigned int SegmentMan::calculateDownloadSpeed()
|