diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-01-14 18:11:31 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-01-14 21:02:58 +0900 |
| commit | d05ef28104d4d6b01a1a1a1087fcc65b5bc5b8db (patch) | |
| tree | a0acc7642baec0fdec2f75bb75c979885d5b6339 /src/DefaultBtInteractive.cc | |
| parent | d8f5887bbe7bc0ca31c37ed1bdc3a37431ca26b7 (diff) | |
Avoid tiny packet for Have and Request message
Diffstat (limited to 'src/DefaultBtInteractive.cc')
| -rw-r--r-- | src/DefaultBtInteractive.cc | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index 58e02093..1fd2199f 100644 --- a/src/DefaultBtInteractive.cc +++ b/src/DefaultBtInteractive.cc @@ -97,7 +97,8 @@ DefaultBtInteractive::DefaultBtInteractive numReceivedMessage_(0), maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST), requestGroupMan_(0), - tcpPort_(0) + tcpPort_(0), + haveLastSent_(global::wallclock()) {} DefaultBtInteractive::~DefaultBtInteractive() {} @@ -247,20 +248,28 @@ void DefaultBtInteractive::decideChoking() { } void DefaultBtInteractive::checkHave() { - std::vector<size_t> indexes; - pieceStorage_->getAdvertisedPieceIndexes(indexes, cuid_, haveTimer_); + const size_t MIN_HAVE_PACK_SIZE = 20; + const time_t MAX_HAVE_DELAY_SEC = 10; + pieceStorage_->getAdvertisedPieceIndexes(haveIndexes_, cuid_, haveTimer_); haveTimer_ = global::wallclock(); - if(indexes.size() >= 20) { + if(haveIndexes_.size() >= MIN_HAVE_PACK_SIZE) { if(peer_->isFastExtensionEnabled() && pieceStorage_->allDownloadFinished()) { dispatcher_->addMessageToQueue(messageFactory_->createHaveAllMessage()); } else { dispatcher_->addMessageToQueue(messageFactory_->createBitfieldMessage()); } + haveIndexes_.clear(); } else { - for(std::vector<size_t>::const_iterator itr = indexes.begin(), - eoi = indexes.end(); itr != eoi; ++itr) { - dispatcher_->addMessageToQueue(messageFactory_->createHaveMessage(*itr)); + if(haveIndexes_.size() >= MIN_HAVE_PACK_SIZE || + haveLastSent_.difference(global::wallclock()) >= MAX_HAVE_DELAY_SEC) { + 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() && - countOldOutstandingRequest >= maxOutstandingRequest_ && - dispatcher_->countOutstandingRequest()*2 <= maxOutstandingRequest_){ + countOldOutstandingRequest > dispatcher_->countOutstandingRequest() && + (countOldOutstandingRequest - dispatcher_->countOutstandingRequest())*2 >= + maxOutstandingRequest_) { maxOutstandingRequest_ = std::min((size_t)UB_MAX_OUTSTANDING_REQUEST, maxOutstandingRequest_+OUTSTANDING_REQUEST_STEP); @@ -383,13 +393,17 @@ void DefaultBtInteractive::addRequests() { if(!pieceStorage_->isEndGame() && !pieceStorage_->hasMissingUnusedPiece()) { pieceStorage_->enterEndGame(); } - if(pieceStorage_->isEndGame()) { - maxOutstandingRequest_ = 2; - } fillPiece(maxOutstandingRequest_); size_t reqNumToCreate = maxOutstandingRequest_ <= dispatcher_->countOutstandingRequest() ? 0 : maxOutstandingRequest_-dispatcher_->countOutstandingRequest(); + + if(dispatcher_->countOutstandingRequest() != 0 && + reqNumToCreate*2 < maxOutstandingRequest_) { + // Avoid small number of Requests. + return; + } + if(reqNumToCreate > 0) { std::vector<SharedHandle<BtMessage> > requests; requests.reserve(reqNumToCreate); |
