merged changes from RC_1_0
This commit is contained in:
parent
77363ad93e
commit
e526355d24
|
@ -35,6 +35,7 @@
|
|||
|
||||
1.0.3 release
|
||||
|
||||
* fix bug in interest calculation, causing premature disconnects
|
||||
* tweak flag_override_resume_data semantics to make more sense (breaks
|
||||
backwards compatibility of edge-cases)
|
||||
* 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>off : <define>TORRENT_USE_ICONV=0 ;
|
||||
|
||||
feature valgrind : off on : composite propagated link-incompatible ;
|
||||
feature.compose <valgrind>on : <define>TORRENT_USE_VALGRIND=1 ;
|
||||
feature use-valgrind : off on : composite propagated link-incompatible ;
|
||||
feature.compose <use-valgrind>on : <define>TORRENT_USE_VALGRIND=1 ;
|
||||
|
||||
feature memory-optimization : off on : composite propagated link-incompatible ;
|
||||
feature.compose <memory-optimization>on : <define>TORRENT_OPTIMIZE_MEMORY_USAGE ;
|
||||
|
|
|
@ -2101,7 +2101,7 @@ namespace libtorrent
|
|||
if (piece >= 0) superseed_piece(-1, piece);
|
||||
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();
|
||||
send_allowed_set();
|
||||
|
|
|
@ -517,6 +517,8 @@ namespace libtorrent
|
|||
else t->peer_is_interesting(*this);
|
||||
|
||||
TORRENT_ASSERT(in_handshake() || is_interesting() == interested);
|
||||
|
||||
disconnect_if_redundant();
|
||||
}
|
||||
|
||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
|
||||
|
@ -1887,6 +1889,15 @@ namespace libtorrent
|
|||
++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
|
||||
// updated the piece picker, otherwise we will incorrectly
|
||||
// decrement the piece count without first incrementing it
|
||||
|
@ -1912,12 +1923,6 @@ namespace libtorrent
|
|||
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
|
||||
// forwarded this piece. In which case we need to give
|
||||
// a new piece to that peer
|
||||
|
@ -2100,39 +2105,21 @@ namespace libtorrent
|
|||
return;
|
||||
}
|
||||
|
||||
// let the torrent know which pieces the
|
||||
// peer has
|
||||
// if we're a seed, we don't keep track of piece availability
|
||||
bool interesting = false;
|
||||
// let the torrent know which pieces the peer has if we're a seed, we
|
||||
// don't keep track of piece availability
|
||||
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_num_pieces = num_pieces;
|
||||
|
||||
if (interesting) t->peer_is_interesting(*this);
|
||||
else if (upload_only()
|
||||
&& can_disconnect(error_code(errors::upload_upload_connection, get_libtorrent_category())))
|
||||
disconnect(errors::upload_upload_connection, op_bittorrent);
|
||||
update_interest();
|
||||
}
|
||||
|
||||
bool peer_connection::disconnect_if_redundant()
|
||||
{
|
||||
TORRENT_ASSERT(is_single_thread());
|
||||
if (m_disconnecting) return false;
|
||||
if (m_need_interest_update) return false;
|
||||
|
||||
// we cannot disconnect in a constructor
|
||||
TORRENT_ASSERT(m_in_constructor == false);
|
||||
|
@ -2153,6 +2140,9 @@ namespace libtorrent
|
|||
if (m_upload_only && t->is_upload_only()
|
||||
&& 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);
|
||||
return true;
|
||||
}
|
||||
|
@ -2163,6 +2153,9 @@ namespace libtorrent
|
|||
&& t->are_files_checked()
|
||||
&& 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);
|
||||
return true;
|
||||
}
|
||||
|
@ -6578,6 +6571,7 @@ namespace libtorrent
|
|||
// make sure upload only peers are disconnected
|
||||
if (t->is_upload_only()
|
||||
&& m_upload_only
|
||||
&& !m_need_interest_update
|
||||
&& t->valid_metadata()
|
||||
&& has_metadata()
|
||||
&& ok_to_disconnect)
|
||||
|
@ -6585,6 +6579,7 @@ namespace libtorrent
|
|||
|
||||
if (m_upload_only
|
||||
&& !m_interesting
|
||||
&& !m_need_interest_update
|
||||
&& m_bitfield_received
|
||||
&& t->are_files_checked()
|
||||
&& t->valid_metadata()
|
||||
|
|
|
@ -135,7 +135,7 @@ namespace libtorrent
|
|||
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),
|
||||
SET(send_redundant_have, true, 0),
|
||||
SET(lazy_bitfields, true, 0),
|
||||
SET(lazy_bitfields, false, 0),
|
||||
SET(use_dht_as_fallback, false, 0),
|
||||
SET(upnp_ignore_nonrouters, false, 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
|
||||
// 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());
|
||||
file_storage const& fs = m_torrent_file->files();
|
||||
|
@ -10944,6 +10945,11 @@ namespace libtorrent
|
|||
fp[i] = fs.file_size(i);
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -87,7 +87,7 @@ project
|
|||
;
|
||||
|
||||
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 :
|
||||
[ run test_resume.cpp ]
|
||||
|
@ -158,7 +158,6 @@ test-suite libtorrent :
|
|||
[ run test_http_connection.cpp ]
|
||||
[ run test_torrent.cpp ]
|
||||
[ run test_transfer.cpp ]
|
||||
# [ run test_entry.cpp ]
|
||||
[ run test_metadata_extension.cpp ]
|
||||
[ run test_trackers_extension.cpp ]
|
||||
[ run test_time_critical.cpp ]
|
||||
|
|
|
@ -69,6 +69,14 @@ bool on_alert(alert* a)
|
|||
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)
|
||||
{
|
||||
// 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("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 ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49075, 50000), "0.0.0.0", 0, mask);
|
||||
|
||||
settings_pack pack = sett;
|
||||
|
||||
// we need a short reconnect time since we
|
||||
// finish the torrent and then restart it
|
||||
// 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::in_enc_policy, settings_pack::pe_disabled);
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
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);
|
||||
file.close();
|
||||
|
||||
int udp_tracker_port = start_udp_tracker();
|
||||
int tracker_port = start_web_server();
|
||||
|
||||
char tracker_url[200];
|
||||
snprintf(tracker_url, sizeof(tracker_url), "http://127.0.0.1:%d/announce", tracker_port);
|
||||
t->add_tracker(tracker_url);
|
||||
|
@ -392,17 +381,17 @@ void test_transfer(settings_pack const& sett)
|
|||
TEST_CHECK(st2.is_seeding);
|
||||
|
||||
// this allows shutting down the sessions in parallel
|
||||
p1 = ses1.abort();
|
||||
p2 = ses2.abort();
|
||||
|
||||
stop_udp_tracker();
|
||||
stop_web_server();
|
||||
sp.push_back(ses1.abort());
|
||||
sp.push_back(ses2.abort());
|
||||
}
|
||||
|
||||
int test_main()
|
||||
{
|
||||
using namespace libtorrent;
|
||||
|
||||
udp_tracker_port = start_udp_tracker();
|
||||
tracker_port = start_web_server();
|
||||
|
||||
// test with all kinds of proxies
|
||||
settings_pack p;
|
||||
|
||||
|
@ -410,6 +399,9 @@ int test_main()
|
|||
p = settings_pack();
|
||||
p.set_bool(settings_pack::contiguous_recv_buffer, false);
|
||||
test_transfer(p);
|
||||
|
||||
p.set_bool(settings_pack::lazy_bitfields, true);
|
||||
test_transfer(p);
|
||||
|
||||
error_code ec;
|
||||
remove_all("tmp1_priorities", ec);
|
||||
|
@ -417,6 +409,13 @@ int test_main()
|
|||
remove_all("tmp1_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;
|
||||
}
|
||||
|
||||
|
|
|
@ -119,7 +119,7 @@ std::vector<char> generate_resume_data(torrent_info* ti)
|
|||
|
||||
torrent_status test_resume_flags(int flags)
|
||||
{
|
||||
session ses;
|
||||
libtorrent::session ses;
|
||||
|
||||
boost::shared_ptr<torrent_info> ti = generate_torrent();
|
||||
|
||||
|
|
|
@ -70,6 +70,18 @@ int test_main()
|
|||
|
||||
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
|
||||
// for the asynchronous call to set the alert
|
||||
// mask completes, before it goes on to destruct
|
||||
|
|
Loading…
Reference in New Issue