summaryrefslogtreecommitdiff
path: root/src/DefaultBtInteractive.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-26 14:49:40 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-26 14:49:40 +0000
commit835de071f2cc5c65df13753935a38d7fa87ce326 (patch)
treee68e86fd70cccc331c7730beca1ad3946ec6d400 /src/DefaultBtInteractive.cc
parente396d2e2c44a36eec5b6069403b82615519fb218 (diff)
2010-08-26 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Enter end game mode as soon as all pieces are assigned to peer to avoid substantial slow down at the very last stage of download. * src/DefaultBtInteractive.cc * src/DefaultPieceStorage.cc * src/DefaultPieceStorage.h * src/PieceStorage.h * src/UnknownLengthPieceStorage.h * test/MockPieceStorage.h
Diffstat (limited to 'src/DefaultBtInteractive.cc')
-rw-r--r--src/DefaultBtInteractive.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc
index 783072c5..95c2cccb 100644
--- a/src/DefaultBtInteractive.cc
+++ b/src/DefaultBtInteractive.cc
@@ -323,7 +323,8 @@ size_t DefaultBtInteractive::receiveMessages() {
break;
}
}
- if(countOldOutstandingRequest >= maxOutstandingRequest_ &&
+ if(!pieceStorage_->isEndGame() &&
+ countOldOutstandingRequest >= maxOutstandingRequest_ &&
dispatcher_->countOutstandingRequest() == 0){
maxOutstandingRequest_ =
std::min((size_t)UB_MAX_OUTSTANDING_REQUEST,
@@ -394,6 +395,12 @@ void DefaultBtInteractive::fillPiece(size_t maxMissingBlock) {
}
void DefaultBtInteractive::addRequests() {
+ if(!pieceStorage_->isEndGame() && !pieceStorage_->hasMissingUnusedPiece()) {
+ pieceStorage_->enterEndGame();
+ }
+ if(pieceStorage_->isEndGame()) {
+ maxOutstandingRequest_ = 2;
+ }
fillPiece(maxOutstandingRequest_);
size_t reqNumToCreate =
maxOutstandingRequest_ <= dispatcher_->countOutstandingRequest() ?
@@ -402,6 +409,7 @@ void DefaultBtInteractive::addRequests() {
std::vector<SharedHandle<BtMessage> > requests;
requests.reserve(reqNumToCreate);
if(pieceStorage_->isEndGame()) {
+ logger_->debug("ENDGAME");
btRequestFactory_->createRequestMessagesOnEndGame(requests,reqNumToCreate);
} else {
btRequestFactory_->createRequestMessages(requests, reqNumToCreate);