From 83922769754611b8aac49b28f46def0eb22481f9 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Mon, 14 May 2007 10:54:18 +0000 Subject: [PATCH] speed categories are now disabled before 1% of the pieces have been downloaded --- include/libtorrent/piece_picker.hpp | 3 +++ src/piece_picker.cpp | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/libtorrent/piece_picker.hpp b/include/libtorrent/piece_picker.hpp index 6ef1041e9..7b8612909 100755 --- a/include/libtorrent/piece_picker.hpp +++ b/include/libtorrent/piece_picker.hpp @@ -386,6 +386,9 @@ namespace libtorrent // the number of pieces we have that also are filtered int m_num_have_filtered; + + // the number of pieces we have + int m_num_have; // the required popularity of a piece in order to download // it in sequence instead of random order. diff --git a/src/piece_picker.cpp b/src/piece_picker.cpp index 5d8f15bf9..cf6eb4a0e 100755 --- a/src/piece_picker.cpp +++ b/src/piece_picker.cpp @@ -59,6 +59,7 @@ namespace libtorrent , m_piece_map((total_num_blocks + blocks_per_piece-1) / blocks_per_piece) , m_num_filtered(0) , m_num_have_filtered(0) + , m_num_have(0) , m_sequenced_download_threshold(100) { assert(blocks_per_piece > 0); @@ -82,6 +83,7 @@ namespace libtorrent // and make them invalid (as if though we already had every piece) std::fill(m_piece_map.begin(), m_piece_map.end() , piece_pos(0, piece_pos::we_have_index)); + m_num_have = m_piece_map.size(); } // pieces is a bitmask with the pieces we have @@ -98,6 +100,7 @@ namespace libtorrent if (*i) continue; int index = static_cast(i - pieces.begin()); m_piece_map[index].index = 0; + --m_num_have; if (m_piece_map[index].filtered()) { ++m_num_filtered; @@ -279,6 +282,7 @@ namespace libtorrent int num_filtered = 0; int num_have_filtered = 0; + int num_have = 0; for (std::vector::const_iterator i = m_piece_map.begin(); i != m_piece_map.end(); ++i) { @@ -290,6 +294,9 @@ namespace libtorrent else ++num_have_filtered; } + if (i->index == piece_pos::we_have_index) + ++num_have; + #if 0 if (t != 0) { @@ -377,6 +384,7 @@ namespace libtorrent assert(count == 0); } } + assert(num_have == m_num_have); assert(num_filtered == m_num_filtered); assert(num_have_filtered == m_num_have_filtered); } @@ -890,12 +898,13 @@ namespace libtorrent assert(std::find_if(m_downloads.begin(), m_downloads.end() , has_index(index)) == m_downloads.end()); + if (p.have()) return; if (p.filtered()) { --m_num_filtered; ++m_num_have_filtered; } - if (p.have()) return; + ++m_num_have; p.set_have(); if (priority == 0) return; assert(p.priority(m_sequenced_download_threshold) == 0); @@ -1089,6 +1098,10 @@ namespace libtorrent // if the peer doesn't have the piece // skip it if (!pieces[*i]) continue; + + // if we have less than 1% of the pieces, ignore speed priorities and just try + // to finish any downloading piece + bool ignore_speed_categories = (m_num_have * 100 / m_piece_map.size()) < 1; int num_blocks_in_piece = blocks_in_piece(*i); @@ -1138,7 +1151,9 @@ namespace libtorrent // have been requested from the same peer or // if the state of the piece is none (the // piece will in that case change state). - if (p->state != none && p->state != speed && !only_same_peer) + if (p->state != none && p->state != speed + && !only_same_peer + && !ignore_speed_categories) { if (int(backup_blocks.size()) >= num_blocks) continue; backup_blocks.push_back(piece_block(*i, j));