Download rate based strategy to increase outstanding request

This strategy performs better than old one in high latency
environment.
pull/43/head
Tatsuhiro Tsujikawa 2013-01-15 00:02:40 +09:00
parent 2e216a9403
commit 53dde0a9ae
3 changed files with 25 additions and 10 deletions

View File

@ -48,12 +48,12 @@
#define MAX_BLOCK_LENGTH (16*1024)
#define DEFAULT_MAX_OUTSTANDING_REQUEST 6
#define DEFAULT_MAX_OUTSTANDING_REQUEST 2
#define OUTSTANDING_REQUEST_STEP 6
// Upper Bound of the number of outstanding request
#define UB_MAX_OUTSTANDING_REQUEST 256
#define UB_MAX_OUTSTANDING_REQUEST 512
#define METADATA_PIECE_SIZE (16*1024)

View File

@ -98,7 +98,8 @@ DefaultBtInteractive::DefaultBtInteractive
maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST),
requestGroupMan_(0),
tcpPort_(0),
haveLastSent_(global::wallclock())
haveLastSent_(global::wallclock()),
baseSpeed_(0)
{}
DefaultBtInteractive::~DefaultBtInteractive() {}
@ -321,13 +322,25 @@ size_t DefaultBtInteractive::receiveMessages() {
break;
}
}
if(!pieceStorage_->isEndGame() &&
countOldOutstandingRequest > dispatcher_->countOutstandingRequest() &&
(countOldOutstandingRequest - dispatcher_->countOutstandingRequest())*2 >=
maxOutstandingRequest_) {
maxOutstandingRequest_ =
std::min((size_t)UB_MAX_OUTSTANDING_REQUEST,
maxOutstandingRequest_+OUTSTANDING_REQUEST_STEP);
if(!pieceStorage_->isEndGame() && !pieceStorage_->downloadFinished()) {
if(baseSpeed_ == 0) {
if(countOldOutstandingRequest &&
dispatcher_->countOutstandingRequest() == 0) {
baseSpeed_ = peer_->calculateDownloadSpeed();
maxOutstandingRequest_ *= 2;
}
} else {
int speed = peer_->calculateDownloadSpeed();
// Double the number of outstanding request if 20% download rate
// increase is observed.
if(baseSpeed_*12 <= speed*10) {
maxOutstandingRequest_ =
std::min((size_t)UB_MAX_OUTSTANDING_REQUEST,
maxOutstandingRequest_*2);
baseSpeed_ = speed;
}
}
}
return msgcount;
}

View File

@ -149,6 +149,8 @@ private:
std::vector<size_t> haveIndexes_;
Timer haveLastSent_;
int baseSpeed_;
static const time_t FLOODING_CHECK_INTERVAL = 5;
void addBitfieldMessageToQueue();