|
@@ -62,7 +62,8 @@ DefaultPeerStorage::DefaultPeerStorage()
|
|
: maxPeerListSize_(MAX_PEER_LIST_SIZE),
|
|
: maxPeerListSize_(MAX_PEER_LIST_SIZE),
|
|
seederStateChoke_(make_unique<BtSeederStateChoke>()),
|
|
seederStateChoke_(make_unique<BtSeederStateChoke>()),
|
|
leecherStateChoke_(make_unique<BtLeecherStateChoke>()),
|
|
leecherStateChoke_(make_unique<BtLeecherStateChoke>()),
|
|
- lastTransferStatMapUpdated_(Timer::zero())
|
|
|
|
|
|
+ lastTransferStatMapUpdated_(Timer::zero()),
|
|
|
|
+ forceChokeRound_(false)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
@@ -284,16 +285,21 @@ void DefaultPeerStorage::returnPeer(const std::shared_ptr<Peer>& peer)
|
|
bool DefaultPeerStorage::chokeRoundIntervalElapsed()
|
|
bool DefaultPeerStorage::chokeRoundIntervalElapsed()
|
|
{
|
|
{
|
|
constexpr auto CHOKE_ROUND_INTERVAL = 10_s;
|
|
constexpr auto CHOKE_ROUND_INTERVAL = 10_s;
|
|
|
|
+ auto forceChokeRound = forceChokeRound_;
|
|
|
|
+ forceChokeRound_ = false;
|
|
|
|
+
|
|
if (pieceStorage_->downloadFinished()) {
|
|
if (pieceStorage_->downloadFinished()) {
|
|
|
|
+ auto interval = forceChokeRound ? 1_s : CHOKE_ROUND_INTERVAL;
|
|
return seederStateChoke_->getLastRound().difference(global::wallclock()) >=
|
|
return seederStateChoke_->getLastRound().difference(global::wallclock()) >=
|
|
- CHOKE_ROUND_INTERVAL;
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- return leecherStateChoke_->getLastRound().difference(global::wallclock()) >=
|
|
|
|
- CHOKE_ROUND_INTERVAL;
|
|
|
|
|
|
+ interval;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return leecherStateChoke_->getLastRound().difference(global::wallclock()) >=
|
|
|
|
+ CHOKE_ROUND_INTERVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void DefaultPeerStorage::scheduleForcedChokeRound() { forceChokeRound_ = true; }
|
|
|
|
+
|
|
void DefaultPeerStorage::executeChoke()
|
|
void DefaultPeerStorage::executeChoke()
|
|
{
|
|
{
|
|
if (pieceStorage_->downloadFinished()) {
|
|
if (pieceStorage_->downloadFinished()) {
|