fixes bug where priorities where lost when force-rechecking.
This commit is contained in:
parent
66ac9fe718
commit
e9045cc1df
|
@ -161,6 +161,7 @@ namespace libtorrent
|
||||||
void we_have(int index);
|
void we_have(int index);
|
||||||
void we_dont_have(int index);
|
void we_dont_have(int index);
|
||||||
|
|
||||||
|
// sets all pieces to dont-have
|
||||||
void init(int blocks_per_piece, int total_num_blocks);
|
void init(int blocks_per_piece, int total_num_blocks);
|
||||||
int num_pieces() const { return int(m_piece_map.size()); }
|
int num_pieces() const { return int(m_piece_map.size()); }
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,18 @@ namespace libtorrent
|
||||||
m_piece_map.resize((total_num_blocks + blocks_per_piece-1) / blocks_per_piece
|
m_piece_map.resize((total_num_blocks + blocks_per_piece-1) / blocks_per_piece
|
||||||
, piece_pos(0, 0));
|
, piece_pos(0, 0));
|
||||||
|
|
||||||
|
m_num_filtered += m_num_have_filtered;
|
||||||
|
m_num_have_filtered = 0;
|
||||||
|
m_num_have = 0;
|
||||||
|
m_dirty = true;
|
||||||
|
for (std::vector<piece_pos>::iterator i = m_piece_map.begin()
|
||||||
|
, end(m_piece_map.end()); i != end; ++i)
|
||||||
|
{
|
||||||
|
i->peer_count = 0;
|
||||||
|
i->downloading = 0;
|
||||||
|
i->index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// the piece index is stored in 20 bits, which limits the allowed
|
// the piece index is stored in 20 bits, which limits the allowed
|
||||||
// number of pieces somewhat
|
// number of pieces somewhat
|
||||||
if (m_piece_map.size() >= piece_pos::we_have_index)
|
if (m_piece_map.size() >= piece_pos::we_have_index)
|
||||||
|
@ -1074,7 +1086,7 @@ namespace libtorrent
|
||||||
if (new_piece_priority == int(p.piece_priority)) return false;
|
if (new_piece_priority == int(p.piece_priority)) return false;
|
||||||
|
|
||||||
int prev_priority = p.priority(this);
|
int prev_priority = p.priority(this);
|
||||||
TORRENT_ASSERT(prev_priority < int(m_priority_boundries.size()));
|
TORRENT_ASSERT(m_dirty | prev_priority < int(m_priority_boundries.size()));
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (new_piece_priority == piece_pos::filter_priority
|
if (new_piece_priority == piece_pos::filter_priority
|
||||||
|
@ -1101,8 +1113,6 @@ namespace libtorrent
|
||||||
|
|
||||||
if (prev_priority == new_priority) return ret;
|
if (prev_priority == new_priority) return ret;
|
||||||
|
|
||||||
TORRENT_ASSERT(prev_priority < int(m_priority_boundries.size()));
|
|
||||||
|
|
||||||
if (m_dirty) return ret;
|
if (m_dirty) return ret;
|
||||||
if (prev_priority == -1)
|
if (prev_priority == -1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -667,7 +667,6 @@ namespace libtorrent
|
||||||
, m_save_path, m_ses.m_files, m_ses.m_disk_thread, m_storage_constructor
|
, m_save_path, m_ses.m_files, m_ses.m_disk_thread, m_storage_constructor
|
||||||
, m_storage_mode);
|
, m_storage_mode);
|
||||||
m_storage = m_owning_storage.get();
|
m_storage = m_owning_storage.get();
|
||||||
m_picker.reset(new piece_picker);
|
|
||||||
m_picker->init(m_torrent_file->piece_length() / m_block_size
|
m_picker->init(m_torrent_file->piece_length() / m_block_size
|
||||||
, int((m_torrent_file->total_size()+m_block_size-1)/m_block_size));
|
, int((m_torrent_file->total_size()+m_block_size-1)/m_block_size));
|
||||||
// assume that we don't have anything
|
// assume that we don't have anything
|
||||||
|
|
|
@ -278,6 +278,33 @@ int test_main()
|
||||||
TEST_CHECK(int(picked.size()) > 0);
|
TEST_CHECK(int(picked.size()) > 0);
|
||||||
TEST_CHECK(picked.front().piece_index == 1);
|
TEST_CHECK(picked.front().piece_index == 1);
|
||||||
|
|
||||||
|
// ========================================================
|
||||||
|
|
||||||
|
// make sure init preserves priorities
|
||||||
|
print_title("test init");
|
||||||
|
p = setup_picker("1111111", " ", "1111111", "");
|
||||||
|
|
||||||
|
TEST_CHECK(p->num_filtered() == 0);
|
||||||
|
TEST_CHECK(p->num_have_filtered() == 0);
|
||||||
|
TEST_CHECK(p->num_have() == 0);
|
||||||
|
|
||||||
|
p->set_piece_priority(0, 0);
|
||||||
|
TEST_CHECK(p->num_filtered() == 1);
|
||||||
|
TEST_CHECK(p->num_have_filtered() == 0);
|
||||||
|
TEST_CHECK(p->num_have() == 0);
|
||||||
|
|
||||||
|
p->we_have(0);
|
||||||
|
|
||||||
|
TEST_CHECK(p->num_filtered() == 0);
|
||||||
|
TEST_CHECK(p->num_have_filtered() == 1);
|
||||||
|
TEST_CHECK(p->num_have() == 1);
|
||||||
|
|
||||||
|
p->init(blocks_per_piece, blocks_per_piece * 7);
|
||||||
|
TEST_CHECK(p->piece_priority(0) == 0);
|
||||||
|
TEST_CHECK(p->num_filtered() == 1);
|
||||||
|
TEST_CHECK(p->num_have_filtered() == 0);
|
||||||
|
TEST_CHECK(p->num_have() == 0);
|
||||||
|
|
||||||
// ========================================================
|
// ========================================================
|
||||||
|
|
||||||
// make sure requested blocks aren't picked
|
// make sure requested blocks aren't picked
|
||||||
|
|
Loading…
Reference in New Issue