Avoid tiny packet for Have and Request message

pull/43/head
Tatsuhiro Tsujikawa 2013-01-14 18:11:31 +09:00
parent d8f5887bbe
commit d05ef28104
2 changed files with 31 additions and 13 deletions

View File

@ -97,7 +97,8 @@ DefaultBtInteractive::DefaultBtInteractive
numReceivedMessage_(0), numReceivedMessage_(0),
maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST), maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST),
requestGroupMan_(0), requestGroupMan_(0),
tcpPort_(0) tcpPort_(0),
haveLastSent_(global::wallclock())
{} {}
DefaultBtInteractive::~DefaultBtInteractive() {} DefaultBtInteractive::~DefaultBtInteractive() {}
@ -247,20 +248,28 @@ void DefaultBtInteractive::decideChoking() {
} }
void DefaultBtInteractive::checkHave() { void DefaultBtInteractive::checkHave() {
std::vector<size_t> indexes; const size_t MIN_HAVE_PACK_SIZE = 20;
pieceStorage_->getAdvertisedPieceIndexes(indexes, cuid_, haveTimer_); const time_t MAX_HAVE_DELAY_SEC = 10;
pieceStorage_->getAdvertisedPieceIndexes(haveIndexes_, cuid_, haveTimer_);
haveTimer_ = global::wallclock(); haveTimer_ = global::wallclock();
if(indexes.size() >= 20) { if(haveIndexes_.size() >= MIN_HAVE_PACK_SIZE) {
if(peer_->isFastExtensionEnabled() && if(peer_->isFastExtensionEnabled() &&
pieceStorage_->allDownloadFinished()) { pieceStorage_->allDownloadFinished()) {
dispatcher_->addMessageToQueue(messageFactory_->createHaveAllMessage()); dispatcher_->addMessageToQueue(messageFactory_->createHaveAllMessage());
} else { } else {
dispatcher_->addMessageToQueue(messageFactory_->createBitfieldMessage()); dispatcher_->addMessageToQueue(messageFactory_->createBitfieldMessage());
} }
haveIndexes_.clear();
} else { } else {
for(std::vector<size_t>::const_iterator itr = indexes.begin(), if(haveIndexes_.size() >= MIN_HAVE_PACK_SIZE ||
eoi = indexes.end(); itr != eoi; ++itr) { haveLastSent_.difference(global::wallclock()) >= MAX_HAVE_DELAY_SEC) {
dispatcher_->addMessageToQueue(messageFactory_->createHaveMessage(*itr)); haveLastSent_ = global::wallclock();
for(std::vector<size_t>::const_iterator itr = haveIndexes_.begin(),
eoi = haveIndexes_.end(); itr != eoi; ++itr) {
dispatcher_->addMessageToQueue(messageFactory_->
createHaveMessage(*itr));
}
haveIndexes_.clear();
} }
} }
} }
@ -313,8 +322,9 @@ size_t DefaultBtInteractive::receiveMessages() {
} }
} }
if(!pieceStorage_->isEndGame() && if(!pieceStorage_->isEndGame() &&
countOldOutstandingRequest >= maxOutstandingRequest_ && countOldOutstandingRequest > dispatcher_->countOutstandingRequest() &&
dispatcher_->countOutstandingRequest()*2 <= maxOutstandingRequest_){ (countOldOutstandingRequest - dispatcher_->countOutstandingRequest())*2 >=
maxOutstandingRequest_) {
maxOutstandingRequest_ = maxOutstandingRequest_ =
std::min((size_t)UB_MAX_OUTSTANDING_REQUEST, std::min((size_t)UB_MAX_OUTSTANDING_REQUEST,
maxOutstandingRequest_+OUTSTANDING_REQUEST_STEP); maxOutstandingRequest_+OUTSTANDING_REQUEST_STEP);
@ -383,13 +393,17 @@ void DefaultBtInteractive::addRequests() {
if(!pieceStorage_->isEndGame() && !pieceStorage_->hasMissingUnusedPiece()) { if(!pieceStorage_->isEndGame() && !pieceStorage_->hasMissingUnusedPiece()) {
pieceStorage_->enterEndGame(); pieceStorage_->enterEndGame();
} }
if(pieceStorage_->isEndGame()) {
maxOutstandingRequest_ = 2;
}
fillPiece(maxOutstandingRequest_); fillPiece(maxOutstandingRequest_);
size_t reqNumToCreate = size_t reqNumToCreate =
maxOutstandingRequest_ <= dispatcher_->countOutstandingRequest() ? maxOutstandingRequest_ <= dispatcher_->countOutstandingRequest() ?
0 : maxOutstandingRequest_-dispatcher_->countOutstandingRequest(); 0 : maxOutstandingRequest_-dispatcher_->countOutstandingRequest();
if(dispatcher_->countOutstandingRequest() != 0 &&
reqNumToCreate*2 < maxOutstandingRequest_) {
// Avoid small number of Requests.
return;
}
if(reqNumToCreate > 0) { if(reqNumToCreate > 0) {
std::vector<SharedHandle<BtMessage> > requests; std::vector<SharedHandle<BtMessage> > requests;
requests.reserve(reqNumToCreate); requests.reserve(reqNumToCreate);

View File

@ -38,6 +38,7 @@
#include "BtInteractive.h" #include "BtInteractive.h"
#include <limits.h> #include <limits.h>
#include <vector>
#include "TimerA2.h" #include "TimerA2.h"
#include "Command.h" #include "Command.h"
@ -145,6 +146,9 @@ private:
uint16_t tcpPort_; uint16_t tcpPort_;
std::vector<size_t> haveIndexes_;
Timer haveLastSent_;
static const time_t FLOODING_CHECK_INTERVAL = 5; static const time_t FLOODING_CHECK_INTERVAL = 5;
void addBitfieldMessageToQueue(); void addBitfieldMessageToQueue();