another attempt at optimizing piece picker
This commit is contained in:
@@ -241,7 +241,8 @@ namespace libtorrent
|
|||||||
void pick_pieces(bitfield const& pieces
|
void pick_pieces(bitfield const& pieces
|
||||||
, std::vector<piece_block>& interesting_blocks, int num_blocks
|
, std::vector<piece_block>& interesting_blocks, int num_blocks
|
||||||
, int prefer_whole_pieces, void* peer, piece_state_t speed
|
, 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
|
// picks blocks from each of the pieces in the piece_list
|
||||||
// vector that is also in the piece bitmask. The blocks
|
// vector that is also in the piece bitmask. The blocks
|
||||||
|
@@ -1358,10 +1358,14 @@ namespace libtorrent
|
|||||||
void piece_picker::pick_pieces(bitfield const& pieces
|
void piece_picker::pick_pieces(bitfield const& pieces
|
||||||
, std::vector<piece_block>& interesting_blocks, int num_blocks
|
, std::vector<piece_block>& interesting_blocks, int num_blocks
|
||||||
, int prefer_whole_pieces, void* peer, piece_state_t speed
|
, 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
|
// 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;
|
if (options & ignore_whole_pieces) prefer_whole_pieces = 0;
|
||||||
|
|
||||||
|
@@ -216,7 +216,7 @@ namespace libtorrent
|
|||||||
// then use this mode.
|
// then use this mode.
|
||||||
p.pick_pieces(*bits, interesting_pieces
|
p.pick_pieces(*bits, interesting_pieces
|
||||||
, num_requests, prefer_whole_pieces, c.peer_info_struct()
|
, 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
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
c.peer_log("*** PIECE_PICKER [ prefer_whole: %d picked: %d ]"
|
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;
|
std::vector<piece_block> picked;
|
||||||
p->pick_pieces(string2vec(availability), picked, num_blocks, prefer_whole_pieces, peer_struct
|
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);
|
print_pick(picked);
|
||||||
TEST_CHECK(verify_pick(p, picked));
|
TEST_CHECK(verify_pick(p, picked));
|
||||||
return picked;
|
return picked;
|
||||||
@@ -693,7 +693,7 @@ int test_main()
|
|||||||
|
|
||||||
picked.clear();
|
picked.clear();
|
||||||
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
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));
|
TEST_CHECK(verify_pick(p, picked, true));
|
||||||
print_pick(picked);
|
print_pick(picked);
|
||||||
// don't pick both busy pieces, just one
|
// don't pick both busy pieces, just one
|
||||||
@@ -702,14 +702,14 @@ int test_main()
|
|||||||
picked.clear();
|
picked.clear();
|
||||||
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
||||||
, piece_picker::fast, piece_picker::prioritize_partials
|
, 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));
|
TEST_CHECK(verify_pick(p, picked, true));
|
||||||
print_pick(picked);
|
print_pick(picked);
|
||||||
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
|
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
|
||||||
|
|
||||||
picked.clear();
|
picked.clear();
|
||||||
p->pick_pieces(string2vec("*******"), picked, 7 * blocks_per_piece, 0, 0
|
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));
|
TEST_CHECK(verify_pick(p, picked, true));
|
||||||
print_pick(picked);
|
print_pick(picked);
|
||||||
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
|
TEST_EQUAL(picked.size(), 7 * blocks_per_piece - 1);
|
||||||
|
Reference in New Issue
Block a user