fixed inverted priority of incoming piece suggestions (#809)

This commit is contained in:
Arvid Norberg 2016-06-12 20:36:05 -04:00 committed by GitHub
parent 5ecd00c5c5
commit 4e0a4db9b4
3 changed files with 68 additions and 3 deletions

View File

@ -1,5 +1,6 @@
1.1.1 release
* fixed inverted priority of incoming piece suggestions
* optimize allow-fast logic
* fix issue where FAST extension messages were not used during handshake
* fixed crash on invalid input in http_parser

View File

@ -1580,10 +1580,14 @@ namespace libtorrent
return;
}
// the piece picker will prioritize the pieces from the beginning to end.
// the later the suggestion is received, the higher priority we should
// ascribe to it, so we need to insert suggestions at the front of the
// queue.
if (int(m_suggested_pieces.size()) > m_settings.get_int(settings_pack::max_suggest_pieces))
m_suggested_pieces.erase(m_suggested_pieces.begin());
m_suggested_pieces.resize(m_settings.get_int(settings_pack::max_suggest_pieces) - 1);
m_suggested_pieces.push_back(index);
m_suggested_pieces.insert(m_suggested_pieces.begin(), index);
#ifndef TORRENT_DISABLE_LOGGING
peer_log(peer_log_alert::info, "SUGGEST_PIECE", "piece: %d added to set: %d"

View File

@ -626,7 +626,7 @@ TORRENT_TEST(reject_suggest)
using namespace libtorrent::detail;
char* ptr = recv_buffer + 1;
int piece = read_int32(ptr);
int const piece = read_int32(ptr);
std::vector<int>::iterator i = std::find(suggested.begin()
, suggested.end(), piece);
@ -660,6 +660,66 @@ TORRENT_TEST(reject_suggest)
print_session_log(*ses);
}
TORRENT_TEST(suggest_order)
{
std::cerr << "\n === test suggest ===\n" << std::endl;
sha1_hash ih;
boost::shared_ptr<lt::session> ses;
io_service ios;
tcp::socket s(ios);
setup_peer(s, ih, ses);
char recv_buffer[1000];
do_handshake(s, ih, recv_buffer);
print_session_log(*ses);
send_have_all(s);
print_session_log(*ses);
std::vector<int> suggested;
suggested.push_back(0);
suggested.push_back(1);
suggested.push_back(2);
suggested.push_back(3);
std::for_each(suggested.begin(), suggested.end()
, boost::bind(&send_suggest_piece, boost::ref(s), _1));
print_session_log(*ses);
send_unchoke(s);
print_session_log(*ses);
int fail_counter = 100;
while (!suggested.empty() && fail_counter > 0)
{
print_session_log(*ses);
int len = read_message(s, recv_buffer, sizeof(recv_buffer));
if (len == -1) break;
print_message(recv_buffer, len);
int msg = recv_buffer[0];
fail_counter--;
// we're just interested in requests
if (msg != 0x6) continue;
using namespace libtorrent::detail;
char* ptr = recv_buffer + 1;
int const piece = read_int32(ptr);
// make sure we receive the requests inverse order of sending the suggest
// messages. The last suggest should be the highest priority
int const expected_piece = suggested.back();
suggested.pop_back();
TEST_EQUAL(piece, expected_piece);
}
print_session_log(*ses);
TEST_CHECK(fail_counter > 0);
s.close();
test_sleep(500);
print_session_log(*ses);
}
TORRENT_TEST(multiple_bitfields)
{
std::cerr << "\n === test multiple bitfields ===\n" << std::endl;