merged changes from RC_1_0
This commit is contained in:
parent
77363ad93e
commit
e526355d24
|
@ -35,6 +35,7 @@
|
||||||
|
|
||||||
1.0.3 release
|
1.0.3 release
|
||||||
|
|
||||||
|
* fix bug in interest calculation, causing premature disconnects
|
||||||
* tweak flag_override_resume_data semantics to make more sense (breaks
|
* tweak flag_override_resume_data semantics to make more sense (breaks
|
||||||
backwards compatibility of edge-cases)
|
backwards compatibility of edge-cases)
|
||||||
* improve DHT bootstrapping and periodic refresh
|
* improve DHT bootstrapping and periodic refresh
|
||||||
|
|
4
Jamfile
4
Jamfile
|
@ -338,8 +338,8 @@ feature iconv : auto on off : composite propagated ;
|
||||||
feature.compose <iconv>on : <define>TORRENT_USE_ICONV=1 ;
|
feature.compose <iconv>on : <define>TORRENT_USE_ICONV=1 ;
|
||||||
feature.compose <iconv>off : <define>TORRENT_USE_ICONV=0 ;
|
feature.compose <iconv>off : <define>TORRENT_USE_ICONV=0 ;
|
||||||
|
|
||||||
feature valgrind : off on : composite propagated link-incompatible ;
|
feature use-valgrind : off on : composite propagated link-incompatible ;
|
||||||
feature.compose <valgrind>on : <define>TORRENT_USE_VALGRIND=1 ;
|
feature.compose <use-valgrind>on : <define>TORRENT_USE_VALGRIND=1 ;
|
||||||
|
|
||||||
feature memory-optimization : off on : composite propagated link-incompatible ;
|
feature memory-optimization : off on : composite propagated link-incompatible ;
|
||||||
feature.compose <memory-optimization>on : <define>TORRENT_OPTIMIZE_MEMORY_USAGE ;
|
feature.compose <memory-optimization>on : <define>TORRENT_OPTIMIZE_MEMORY_USAGE ;
|
||||||
|
|
|
@ -2101,7 +2101,7 @@ namespace libtorrent
|
||||||
if (piece >= 0) superseed_piece(-1, piece);
|
if (piece >= 0) superseed_piece(-1, piece);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (m_supports_fast && t->is_seed())
|
else if (m_supports_fast && t->is_seed() && !m_settings.get_bool(settings_pack::lazy_bitfields))
|
||||||
{
|
{
|
||||||
write_have_all();
|
write_have_all();
|
||||||
send_allowed_set();
|
send_allowed_set();
|
||||||
|
|
|
@ -517,6 +517,8 @@ namespace libtorrent
|
||||||
else t->peer_is_interesting(*this);
|
else t->peer_is_interesting(*this);
|
||||||
|
|
||||||
TORRENT_ASSERT(in_handshake() || is_interesting() == interested);
|
TORRENT_ASSERT(in_handshake() || is_interesting() == interested);
|
||||||
|
|
||||||
|
disconnect_if_redundant();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||||
|
@ -1887,6 +1889,15 @@ namespace libtorrent
|
||||||
++m_remote_pieces_dled;
|
++m_remote_pieces_dled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// it's important to update whether we're intersted in this peer before
|
||||||
|
// calling disconnect_if_redundant, otherwise we may disconnect even if
|
||||||
|
// we are interested
|
||||||
|
if (!t->has_piece_passed(index)
|
||||||
|
&& !t->is_seed()
|
||||||
|
&& !is_interesting()
|
||||||
|
&& (!t->has_picker() || t->picker().piece_priority(index) != 0))
|
||||||
|
t->peer_is_interesting(*this);
|
||||||
|
|
||||||
// it's important to not disconnect before we have
|
// it's important to not disconnect before we have
|
||||||
// updated the piece picker, otherwise we will incorrectly
|
// updated the piece picker, otherwise we will incorrectly
|
||||||
// decrement the piece count without first incrementing it
|
// decrement the piece count without first incrementing it
|
||||||
|
@ -1912,12 +1923,6 @@ namespace libtorrent
|
||||||
if (is_disconnecting()) return;
|
if (is_disconnecting()) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!t->has_piece_passed(index)
|
|
||||||
&& !t->is_seed()
|
|
||||||
&& !is_interesting()
|
|
||||||
&& (!t->has_picker() || t->picker().piece_priority(index) != 0))
|
|
||||||
t->peer_is_interesting(*this);
|
|
||||||
|
|
||||||
// if we're super seeding, this might mean that somebody
|
// if we're super seeding, this might mean that somebody
|
||||||
// forwarded this piece. In which case we need to give
|
// forwarded this piece. In which case we need to give
|
||||||
// a new piece to that peer
|
// a new piece to that peer
|
||||||
|
@ -2100,39 +2105,21 @@ namespace libtorrent
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// let the torrent know which pieces the
|
// let the torrent know which pieces the peer has if we're a seed, we
|
||||||
// peer has
|
// don't keep track of piece availability
|
||||||
// if we're a seed, we don't keep track of piece availability
|
|
||||||
bool interesting = false;
|
|
||||||
t->peer_has(bits, this);
|
t->peer_has(bits, this);
|
||||||
|
|
||||||
if (!t->is_upload_only())
|
|
||||||
{
|
|
||||||
for (int i = 0; i < (int)m_have_piece.size(); ++i)
|
|
||||||
{
|
|
||||||
bool have = bits[i];
|
|
||||||
if (!have || m_have_piece[i]) continue;
|
|
||||||
// if we don't have a picker, the assumption is that the piece
|
|
||||||
// priority is 1, or that we're a seed, but in that case have_piece
|
|
||||||
// would have returned true.
|
|
||||||
if (!t->have_piece(i) && (!t->has_picker() || t->picker().piece_priority(i) != 0))
|
|
||||||
interesting = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_have_piece = bits;
|
m_have_piece = bits;
|
||||||
m_num_pieces = num_pieces;
|
m_num_pieces = num_pieces;
|
||||||
|
|
||||||
if (interesting) t->peer_is_interesting(*this);
|
update_interest();
|
||||||
else if (upload_only()
|
|
||||||
&& can_disconnect(error_code(errors::upload_upload_connection, get_libtorrent_category())))
|
|
||||||
disconnect(errors::upload_upload_connection, op_bittorrent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool peer_connection::disconnect_if_redundant()
|
bool peer_connection::disconnect_if_redundant()
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(is_single_thread());
|
TORRENT_ASSERT(is_single_thread());
|
||||||
if (m_disconnecting) return false;
|
if (m_disconnecting) return false;
|
||||||
|
if (m_need_interest_update) return false;
|
||||||
|
|
||||||
// we cannot disconnect in a constructor
|
// we cannot disconnect in a constructor
|
||||||
TORRENT_ASSERT(m_in_constructor == false);
|
TORRENT_ASSERT(m_in_constructor == false);
|
||||||
|
@ -2153,6 +2140,9 @@ namespace libtorrent
|
||||||
if (m_upload_only && t->is_upload_only()
|
if (m_upload_only && t->is_upload_only()
|
||||||
&& can_disconnect(error_code(errors::upload_upload_connection, get_libtorrent_category())))
|
&& can_disconnect(error_code(errors::upload_upload_connection, get_libtorrent_category())))
|
||||||
{
|
{
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
peer_log("*** the peer is upload-only and our torrent is also upload-only");
|
||||||
|
#endif
|
||||||
disconnect(errors::upload_upload_connection, op_bittorrent);
|
disconnect(errors::upload_upload_connection, op_bittorrent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2163,6 +2153,9 @@ namespace libtorrent
|
||||||
&& t->are_files_checked()
|
&& t->are_files_checked()
|
||||||
&& can_disconnect(error_code(errors::uninteresting_upload_peer, get_libtorrent_category())))
|
&& can_disconnect(error_code(errors::uninteresting_upload_peer, get_libtorrent_category())))
|
||||||
{
|
{
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
peer_log("*** the peer is upload-only and we're not interested in it");
|
||||||
|
#endif
|
||||||
disconnect(errors::uninteresting_upload_peer, op_bittorrent);
|
disconnect(errors::uninteresting_upload_peer, op_bittorrent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -6578,6 +6571,7 @@ namespace libtorrent
|
||||||
// make sure upload only peers are disconnected
|
// make sure upload only peers are disconnected
|
||||||
if (t->is_upload_only()
|
if (t->is_upload_only()
|
||||||
&& m_upload_only
|
&& m_upload_only
|
||||||
|
&& !m_need_interest_update
|
||||||
&& t->valid_metadata()
|
&& t->valid_metadata()
|
||||||
&& has_metadata()
|
&& has_metadata()
|
||||||
&& ok_to_disconnect)
|
&& ok_to_disconnect)
|
||||||
|
@ -6585,6 +6579,7 @@ namespace libtorrent
|
||||||
|
|
||||||
if (m_upload_only
|
if (m_upload_only
|
||||||
&& !m_interesting
|
&& !m_interesting
|
||||||
|
&& !m_need_interest_update
|
||||||
&& m_bitfield_received
|
&& m_bitfield_received
|
||||||
&& t->are_files_checked()
|
&& t->are_files_checked()
|
||||||
&& t->valid_metadata()
|
&& t->valid_metadata()
|
||||||
|
|
|
@ -135,7 +135,7 @@ namespace libtorrent
|
||||||
SET(allow_multiple_connections_per_ip, false, 0),
|
SET(allow_multiple_connections_per_ip, false, 0),
|
||||||
DEPRECATED_SET(ignore_limits_on_local_network, true, &session_impl::update_ignore_rate_limits_on_local_network),
|
DEPRECATED_SET(ignore_limits_on_local_network, true, &session_impl::update_ignore_rate_limits_on_local_network),
|
||||||
SET(send_redundant_have, true, 0),
|
SET(send_redundant_have, true, 0),
|
||||||
SET(lazy_bitfields, true, 0),
|
SET(lazy_bitfields, false, 0),
|
||||||
SET(use_dht_as_fallback, false, 0),
|
SET(use_dht_as_fallback, false, 0),
|
||||||
SET(upnp_ignore_nonrouters, false, 0),
|
SET(upnp_ignore_nonrouters, false, 0),
|
||||||
SET(use_parole_mode, true, 0),
|
SET(use_parole_mode, true, 0),
|
||||||
|
|
|
@ -10936,7 +10936,8 @@ namespace libtorrent
|
||||||
|
|
||||||
// if we're a seed, we don't have an m_file_progress anyway
|
// if we're a seed, we don't have an m_file_progress anyway
|
||||||
// since we don't need one. We know we have all files
|
// since we don't need one. We know we have all files
|
||||||
if (is_seed() || !has_picker())
|
// just fill in the full file sizes as a shortcut
|
||||||
|
if (is_seed())
|
||||||
{
|
{
|
||||||
fp.resize(m_torrent_file->num_files());
|
fp.resize(m_torrent_file->num_files());
|
||||||
file_storage const& fs = m_torrent_file->files();
|
file_storage const& fs = m_torrent_file->files();
|
||||||
|
@ -10944,6 +10945,11 @@ namespace libtorrent
|
||||||
fp[i] = fs.file_size(i);
|
fp[i] = fs.file_size(i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we're not a seed and we don't have a picker, that means we donn't
|
||||||
|
// have any piece yet.
|
||||||
|
if (!has_picker())
|
||||||
|
return;
|
||||||
|
|
||||||
if (num_have() == 0)
|
if (num_have() == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -87,7 +87,7 @@ project
|
||||||
;
|
;
|
||||||
|
|
||||||
feature launcher : none valgrind : composite ;
|
feature launcher : none valgrind : composite ;
|
||||||
feature.compose <launcher>valgrind : <testing.launcher>"valgrind --tool=memcheck -v --num-callers=20 --read-var-info=yes --track-origins=yes --error-exitcode=222 --suppressions=valgrind_suppressions.txt" <valgrind>on ;
|
feature.compose <launcher>valgrind : <testing.launcher>"valgrind --tool=memcheck -v --num-callers=20 --read-var-info=yes --track-origins=yes --error-exitcode=222 --suppressions=valgrind_suppressions.txt" <use-valgrind>on ;
|
||||||
|
|
||||||
test-suite libtorrent :
|
test-suite libtorrent :
|
||||||
[ run test_resume.cpp ]
|
[ run test_resume.cpp ]
|
||||||
|
@ -158,7 +158,6 @@ test-suite libtorrent :
|
||||||
[ run test_http_connection.cpp ]
|
[ run test_http_connection.cpp ]
|
||||||
[ run test_torrent.cpp ]
|
[ run test_torrent.cpp ]
|
||||||
[ run test_transfer.cpp ]
|
[ run test_transfer.cpp ]
|
||||||
# [ run test_entry.cpp ]
|
|
||||||
[ run test_metadata_extension.cpp ]
|
[ run test_metadata_extension.cpp ]
|
||||||
[ run test_trackers_extension.cpp ]
|
[ run test_trackers_extension.cpp ]
|
||||||
[ run test_time_critical.cpp ]
|
[ run test_time_critical.cpp ]
|
||||||
|
|
|
@ -69,6 +69,14 @@ bool on_alert(alert* a)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int udp_tracker_port;
|
||||||
|
int tracker_port;
|
||||||
|
|
||||||
|
// these are declared before the session objects
|
||||||
|
// so that they are destructed last. This enables
|
||||||
|
// the sessions to destruct in parallel
|
||||||
|
std::vector<session_proxy> sp;
|
||||||
|
|
||||||
void test_transfer(settings_pack const& sett)
|
void test_transfer(settings_pack const& sett)
|
||||||
{
|
{
|
||||||
// in case the previous run was terminated
|
// in case the previous run was terminated
|
||||||
|
@ -78,16 +86,11 @@ void test_transfer(settings_pack const& sett)
|
||||||
remove_all("tmp1_priority_moved", ec);
|
remove_all("tmp1_priority_moved", ec);
|
||||||
remove_all("tmp2_priority_moved", ec);
|
remove_all("tmp2_priority_moved", ec);
|
||||||
|
|
||||||
// these are declared before the session objects
|
|
||||||
// so that they are destructed last. This enables
|
|
||||||
// the sessions to destruct in parallel
|
|
||||||
session_proxy p1;
|
|
||||||
session_proxy p2;
|
|
||||||
|
|
||||||
lt::session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48075, 49000), "0.0.0.0", 0, mask);
|
lt::session ses1(fingerprint("LT", 0, 1, 0, 0), std::make_pair(48075, 49000), "0.0.0.0", 0, mask);
|
||||||
lt::session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49075, 50000), "0.0.0.0", 0, mask);
|
lt::session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49075, 50000), "0.0.0.0", 0, mask);
|
||||||
|
|
||||||
settings_pack pack = sett;
|
settings_pack pack = sett;
|
||||||
|
|
||||||
// we need a short reconnect time since we
|
// we need a short reconnect time since we
|
||||||
// finish the torrent and then restart it
|
// finish the torrent and then restart it
|
||||||
// immediately to complete the second half.
|
// immediately to complete the second half.
|
||||||
|
@ -106,21 +109,10 @@ void test_transfer(settings_pack const& sett)
|
||||||
|
|
||||||
pack.set_int(settings_pack::out_enc_policy, settings_pack::pe_disabled);
|
pack.set_int(settings_pack::out_enc_policy, settings_pack::pe_disabled);
|
||||||
pack.set_int(settings_pack::in_enc_policy, settings_pack::pe_disabled);
|
pack.set_int(settings_pack::in_enc_policy, settings_pack::pe_disabled);
|
||||||
|
|
||||||
pack.set_bool(settings_pack::allow_multiple_connections_per_ip, false);
|
pack.set_bool(settings_pack::allow_multiple_connections_per_ip, false);
|
||||||
|
|
||||||
pack.set_int(settings_pack::unchoke_slots_limit, 0);
|
|
||||||
ses1.apply_settings(pack);
|
|
||||||
TEST_CHECK(ses1.get_settings().get_int(settings_pack::unchoke_slots_limit) == 0);
|
|
||||||
|
|
||||||
pack.set_int(settings_pack::unchoke_slots_limit, -1);
|
|
||||||
ses1.apply_settings(pack);
|
|
||||||
TEST_CHECK(ses1.get_settings().get_int(settings_pack::unchoke_slots_limit) == -1);
|
|
||||||
|
|
||||||
pack.set_int(settings_pack::unchoke_slots_limit, 8);
|
pack.set_int(settings_pack::unchoke_slots_limit, 8);
|
||||||
ses1.apply_settings(pack);
|
|
||||||
TEST_CHECK(ses1.get_settings().get_int(settings_pack::unchoke_slots_limit) == 8);
|
|
||||||
|
|
||||||
|
ses1.apply_settings(pack);
|
||||||
ses2.apply_settings(pack);
|
ses2.apply_settings(pack);
|
||||||
|
|
||||||
torrent_handle tor1;
|
torrent_handle tor1;
|
||||||
|
@ -131,9 +123,6 @@ void test_transfer(settings_pack const& sett)
|
||||||
boost::shared_ptr<torrent_info> t = ::create_torrent(&file, 16 * 1024, 13, false);
|
boost::shared_ptr<torrent_info> t = ::create_torrent(&file, 16 * 1024, 13, false);
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
int udp_tracker_port = start_udp_tracker();
|
|
||||||
int tracker_port = start_web_server();
|
|
||||||
|
|
||||||
char tracker_url[200];
|
char tracker_url[200];
|
||||||
snprintf(tracker_url, sizeof(tracker_url), "http://127.0.0.1:%d/announce", tracker_port);
|
snprintf(tracker_url, sizeof(tracker_url), "http://127.0.0.1:%d/announce", tracker_port);
|
||||||
t->add_tracker(tracker_url);
|
t->add_tracker(tracker_url);
|
||||||
|
@ -392,17 +381,17 @@ void test_transfer(settings_pack const& sett)
|
||||||
TEST_CHECK(st2.is_seeding);
|
TEST_CHECK(st2.is_seeding);
|
||||||
|
|
||||||
// this allows shutting down the sessions in parallel
|
// this allows shutting down the sessions in parallel
|
||||||
p1 = ses1.abort();
|
sp.push_back(ses1.abort());
|
||||||
p2 = ses2.abort();
|
sp.push_back(ses2.abort());
|
||||||
|
|
||||||
stop_udp_tracker();
|
|
||||||
stop_web_server();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int test_main()
|
int test_main()
|
||||||
{
|
{
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
udp_tracker_port = start_udp_tracker();
|
||||||
|
tracker_port = start_web_server();
|
||||||
|
|
||||||
// test with all kinds of proxies
|
// test with all kinds of proxies
|
||||||
settings_pack p;
|
settings_pack p;
|
||||||
|
|
||||||
|
@ -410,6 +399,9 @@ int test_main()
|
||||||
p = settings_pack();
|
p = settings_pack();
|
||||||
p.set_bool(settings_pack::contiguous_recv_buffer, false);
|
p.set_bool(settings_pack::contiguous_recv_buffer, false);
|
||||||
test_transfer(p);
|
test_transfer(p);
|
||||||
|
|
||||||
|
p.set_bool(settings_pack::lazy_bitfields, true);
|
||||||
|
test_transfer(p);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
remove_all("tmp1_priorities", ec);
|
remove_all("tmp1_priorities", ec);
|
||||||
|
@ -417,6 +409,13 @@ int test_main()
|
||||||
remove_all("tmp1_priorities_moved", ec);
|
remove_all("tmp1_priorities_moved", ec);
|
||||||
remove_all("tmp2_priorities_moved", ec);
|
remove_all("tmp2_priorities_moved", ec);
|
||||||
|
|
||||||
|
stop_udp_tracker();
|
||||||
|
stop_web_server();
|
||||||
|
|
||||||
|
// we have to clear them, session doesn't really support being destructed
|
||||||
|
// as a global destructor (for silly reasons)
|
||||||
|
sp.clear();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ std::vector<char> generate_resume_data(torrent_info* ti)
|
||||||
|
|
||||||
torrent_status test_resume_flags(int flags)
|
torrent_status test_resume_flags(int flags)
|
||||||
{
|
{
|
||||||
session ses;
|
libtorrent::session ses;
|
||||||
|
|
||||||
boost::shared_ptr<torrent_info> ti = generate_torrent();
|
boost::shared_ptr<torrent_info> ti = generate_torrent();
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,18 @@ int test_main()
|
||||||
|
|
||||||
TEST_CHECK(a.get());
|
TEST_CHECK(a.get());
|
||||||
|
|
||||||
|
sett.set_int(settings_pack::unchoke_slots_limit, 0);
|
||||||
|
ses.apply_settings(sett);
|
||||||
|
TEST_CHECK(ses.get_settings().get_int(settings_pack::unchoke_slots_limit) == 0);
|
||||||
|
|
||||||
|
sett.set_int(settings_pack::unchoke_slots_limit, -1);
|
||||||
|
ses.apply_settings(sett);
|
||||||
|
TEST_CHECK(ses.get_settings().get_int(settings_pack::unchoke_slots_limit) == -1);
|
||||||
|
|
||||||
|
sett.set_int(settings_pack::unchoke_slots_limit, 8);
|
||||||
|
ses.apply_settings(sett);
|
||||||
|
TEST_CHECK(ses.get_settings().get_int(settings_pack::unchoke_slots_limit) == 8);
|
||||||
|
|
||||||
// make sure the destructor waits properly
|
// make sure the destructor waits properly
|
||||||
// for the asynchronous call to set the alert
|
// for the asynchronous call to set the alert
|
||||||
// mask completes, before it goes on to destruct
|
// mask completes, before it goes on to destruct
|
||||||
|
|
Loading…
Reference in New Issue