mirror of https://github.com/aria2/aria2
Send have message without too much delay
Also send bitfield rather than have messages if bitfield message is equal to or less than the sum of have messages which otherwise would be sent.pull/704/head
parent
ae11b7a85d
commit
c4cf8fa61d
|
@ -105,8 +105,7 @@ DefaultBtInteractive::DefaultBtInteractive(
|
||||||
numReceivedMessage_(0),
|
numReceivedMessage_(0),
|
||||||
maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST),
|
maxOutstandingRequest_(DEFAULT_MAX_OUTSTANDING_REQUEST),
|
||||||
requestGroupMan_(nullptr),
|
requestGroupMan_(nullptr),
|
||||||
tcpPort_(0),
|
tcpPort_(0)
|
||||||
haveLastSent_(global::wallclock())
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,37 +263,29 @@ void DefaultBtInteractive::decideChoking()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
constexpr auto MAX_HAVE_DELAY_SEC = 10_s;
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
void DefaultBtInteractive::checkHave()
|
void DefaultBtInteractive::checkHave()
|
||||||
{
|
{
|
||||||
const size_t MIN_HAVE_PACK_SIZE = 20;
|
std::vector<size_t> haveIndexes;
|
||||||
pieceStorage_->getAdvertisedPieceIndexes(haveIndexes_, cuid_, haveTimer_);
|
|
||||||
|
pieceStorage_->getAdvertisedPieceIndexes(haveIndexes, cuid_, haveTimer_);
|
||||||
haveTimer_ = global::wallclock();
|
haveTimer_ = global::wallclock();
|
||||||
if (haveIndexes_.size() >= MIN_HAVE_PACK_SIZE) {
|
// Use bitfield message if it is equal to or less than the total
|
||||||
|
// size of have messages.
|
||||||
|
if (5 + pieceStorage_->getBitfieldLength() <= haveIndexes.size() * 9) {
|
||||||
if (peer_->isFastExtensionEnabled() &&
|
if (peer_->isFastExtensionEnabled() &&
|
||||||
pieceStorage_->allDownloadFinished()) {
|
pieceStorage_->allDownloadFinished()) {
|
||||||
dispatcher_->addMessageToQueue(messageFactory_->createHaveAllMessage());
|
dispatcher_->addMessageToQueue(messageFactory_->createHaveAllMessage());
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
dispatcher_->addMessageToQueue(messageFactory_->createBitfieldMessage());
|
dispatcher_->addMessageToQueue(messageFactory_->createBitfieldMessage());
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
haveIndexes_.clear();
|
|
||||||
}
|
for (auto idx : haveIndexes) {
|
||||||
else {
|
dispatcher_->addMessageToQueue(messageFactory_->createHaveMessage(idx));
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,9 +144,6 @@ private:
|
||||||
|
|
||||||
uint16_t tcpPort_;
|
uint16_t tcpPort_;
|
||||||
|
|
||||||
std::vector<size_t> haveIndexes_;
|
|
||||||
Timer haveLastSent_;
|
|
||||||
|
|
||||||
void addBitfieldMessageToQueue();
|
void addBitfieldMessageToQueue();
|
||||||
void addAllowedFastMessageToQueue();
|
void addAllowedFastMessageToQueue();
|
||||||
void addHandshakeExtendedMessageToQueue();
|
void addHandshakeExtendedMessageToQueue();
|
||||||
|
|
Loading…
Reference in New Issue