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_dont_have(int index);
|
||||
|
||||
// sets all pieces to dont-have
|
||||
void init(int blocks_per_piece, int total_num_blocks);
|
||||
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
|
||||
, 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
|
||||
// number of pieces somewhat
|
||||
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;
|
||||
|
||||
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;
|
||||
if (new_piece_priority == piece_pos::filter_priority
|
||||
|
@ -1101,8 +1113,6 @@ namespace libtorrent
|
|||
|
||||
if (prev_priority == new_priority) return ret;
|
||||
|
||||
TORRENT_ASSERT(prev_priority < int(m_priority_boundries.size()));
|
||||
|
||||
if (m_dirty) return ret;
|
||||
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_storage_mode);
|
||||
m_storage = m_owning_storage.get();
|
||||
m_picker.reset(new piece_picker);
|
||||
m_picker->init(m_torrent_file->piece_length() / m_block_size
|
||||
, int((m_torrent_file->total_size()+m_block_size-1)/m_block_size));
|
||||
// assume that we don't have anything
|
||||
|
|
|
@ -278,6 +278,33 @@ int test_main()
|
|||
TEST_CHECK(int(picked.size()) > 0);
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue