From 6b8611885bf5f6c358b09ff4bb2711a13743e814 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 4 Jun 2016 22:10:34 +0900 Subject: [PATCH] Unchoke not-uploading peer if we could not find 3 regular unchokers --- src/BtLeecherStateChoke.cc | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/BtLeecherStateChoke.cc b/src/BtLeecherStateChoke.cc index 72d0be9f5..14da740ea 100644 --- a/src/BtLeecherStateChoke.cc +++ b/src/BtLeecherStateChoke.cc @@ -165,35 +165,37 @@ void BtLeecherStateChoke::regularUnchoke(std::vector& peerEntries) std::mem_fn(&PeerEntry::isRegularUnchoker)); std::sort(std::begin(peerEntries), rest); + std::shuffle(rest, std::end(peerEntries), *SimpleRandomizer::getInstance()); // the number of regular unchokers int count = 3; bool fastOptUnchoker = false; auto peerIter = std::begin(peerEntries); - for (; peerIter != rest && count; ++peerIter, --count) { + for (; peerIter != std::end(peerEntries) && count; ++peerIter, --count) { peerIter->disableChokingRequired(); A2_LOG_INFO(fmt("RU: %s, dlspd=%d", (*peerIter).getPeer()->getIPAddress().c_str(), (*peerIter).getDownloadSpeed())); - if (peerIter->getPeer()->optUnchoking()) { + auto& peer = peerIter->getPeer(); + if (!peer->peerInterested()) { + continue; + } + if (peer->optUnchoking()) { fastOptUnchoker = true; peerIter->disableOptUnchoking(); } } if (fastOptUnchoker) { - std::shuffle(peerIter, std::end(peerEntries), - *SimpleRandomizer::getInstance()); for (auto& p : peerEntries) { - if (p.getPeer()->peerInterested()) { - p.enableOptUnchoking(); - A2_LOG_INFO(fmt("OU: %s", p.getPeer()->getIPAddress().c_str())); - break; - } - else { - p.disableChokingRequired(); - A2_LOG_INFO(fmt("OU: %s", p.getPeer()->getIPAddress().c_str())); + if (!p.getPeer()->peerInterested()) { + continue; } + + p.enableOptUnchoking(); + A2_LOG_INFO(fmt("OU: %s", p.getPeer()->getIPAddress().c_str())); + + break; } } }