mirror of https://github.com/aria2/aria2
Avoid tiny packet for Have and Request message
parent
d8f5887bbe
commit
d05ef28104
|
@ -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);
|
||||||
|
|
|
@ -37,7 +37,8 @@
|
||||||
|
|
||||||
#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();
|
||||||
|
|
Loading…
Reference in New Issue