another attempt at optimizing piece picker
This commit is contained in:
parent
5e92858360
commit
88441e4fdc
|
@ -241,7 +241,8 @@ namespace libtorrent
|
|||
void pick_pieces(bitfield const& pieces
|
||||
, std::vector<piece_block>& interesting_blocks, int num_blocks
|
||||
, int prefer_whole_pieces, void* peer, piece_state_t speed
|
||||
, int options, std::vector<int> const& suggested_pieces) const;
|
||||
, int options, std::vector<int> const& suggested_pieces
|
||||
, int num_peers) const;
|
||||
|
||||
// picks blocks from each of the pieces in the piece_list
|
||||
// vector that is also in the piece bitmask. The blocks
|
||||
|
|
|
@ -1358,10 +1358,14 @@ namespace libtorrent
|
|||
void piece_picker::pick_pieces(bitfield const& pieces
|
||||
, std::vector<piece_block>& interesting_blocks, int num_blocks
|
||||
, int prefer_whole_pieces, void* peer, piece_state_t speed
|
||||
, int options, std::vector<int> const& suggested_pieces) const
|
||||
, int options, std::vector<int> const& suggested_pieces
|
||||
, int num_peers) const
|
||||
{
|
||||
// prevent the number of partial pieces to grow indefinitely
|
||||
if (m_downloads.size() > 20) options |= prioritize_partials;
|
||||
// make this scale by the number of peers we have. For large
|
||||
// scale clients, we would have more peers, and allow a higher
|
||||
// threshold for the number of partials
|
||||
if (m_downloads.size() > num_peers * 3 / 2) options |= prioritize_partials;
|
||||
|
||||
if (options & ignore_whole_pieces) prefer_whole_pieces = 0;
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ namespace libtorrent
|
|||
// then use this mode.
|
||||
p.pick_pieces(*bits, interesting_pieces
|
||||
, num_requests, prefer_whole_pieces, c.peer_info_struct()
|
||||
, state, c.picker_options(), suggested);
|
||||
, state, c.picker_options(), suggested, t.num_peers());
|
||||
|
||||
#ifdef TORRENT_VERBOSE_LOGGING
|
||||
c.peer_log("*** PIECE_PICKER [ prefer_whole: %d picked: %d ]"
|
||||
|
|
|
@ -204,7 +204,7 @@ std::vector<piece_block> pick_pieces(boost::shared_ptr<piece_picker> const& p, c
|
|||
{
|
||||
std::vector<piece_block> picked;
|
||||
p->pick_pieces(string2vec(availability), picked, num_blocks, prefer_whole_pieces, peer_struct
|
||||
, state, options, suggested_pieces);
|
||||
, state, options, suggested_pieces, 20);
|
||||
print_pick(picked);
|
||||
TEST_CHECK(verify_pick(p, picked));
|
||||
return picked;
|
||||
|
@ -693,7 +693,7 @@ int test_main()
|
|||
|
||||
picked.clear();
|
||||
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
||||
, piece_picker::fast, piece_picker::prioritize_partials, empty_vector);
|
||||
, piece_picker::fast, piece_picker::prioritize_partials, empty_vector, 20);
|
||||
TEST_CHECK(verify_pick(p, picked, true));
|
||||
print_pick(picked);
|
||||
// don't pick both busy pieces, just one
|
||||
|
@ -702,14 +702,14 @@ int test_main()
|
|||
picked.clear();
|
||||
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
||||
, piece_picker::fast, piece_picker::prioritize_partials
|
||||
| piece_picker::rarest_first, empty_vector);
|
||||
| piece_picker::rarest_first, empty_vector, 20);
|
||||
TEST_CHECK(verify_pick(p, picked, true));
|
||||
print_pick(picked);
|
||||
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
|
||||
|
||||
picked.clear();
|
||||
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
||||
, piece_picker::fast, piece_picker::rarest_first, empty_vector);
|
||||
, piece_picker::fast, piece_picker::rarest_first, empty_vector, 20);
|
||||
TEST_CHECK(verify_pick(p, picked, true));
|
||||
print_pick(picked);
|
||||
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
|
||||
|
|
Loading…
Reference in New Issue