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; } } }