actually make use of the max_failcount setting

This commit is contained in:
Arvid Norberg 2015-01-20 06:26:22 +00:00
parent d41d59d780
commit d9e69db0cb
7 changed files with 53 additions and 12 deletions

View File

@ -636,6 +636,7 @@ namespace libtorrent
void update_listen_interfaces(); void update_listen_interfaces();
void update_privileged_ports(); void update_privileged_ports();
void update_auto_sequential(); void update_auto_sequential();
void update_max_failcount();
void update_upnp(); void update_upnp();
void update_natpmp(); void update_natpmp();

View File

@ -67,6 +67,7 @@ namespace libtorrent
, min_reconnect_time(60) , min_reconnect_time(60)
, loop_counter(0) , loop_counter(0)
, ip(NULL), port(0) , ip(NULL), port(0)
, max_failcount(3)
, peer_allocator(NULL) , peer_allocator(NULL)
{} {}
bool is_paused; bool is_paused;
@ -90,6 +91,10 @@ namespace libtorrent
external_ip const* ip; external_ip const* ip;
int port; int port;
// the number of times a peer must fail before it's no longer considered
// a connect candidate
int max_failcount;
// this must be set to a torrent_peer allocator // this must be set to a torrent_peer allocator
torrent_peer_allocator_interface* peer_allocator; torrent_peer_allocator_interface* peer_allocator;
@ -193,6 +198,8 @@ namespace libtorrent
void erase_peer(torrent_peer* p, torrent_state* state); void erase_peer(torrent_peer* p, torrent_state* state);
void erase_peer(iterator i, torrent_state* state); void erase_peer(iterator i, torrent_state* state);
void set_max_failcount(torrent_state* st);
private: private:
void recalculate_connect_candidates(torrent_state* state); void recalculate_connect_candidates(torrent_state* state);
@ -207,7 +214,8 @@ namespace libtorrent
bool compare_peer(torrent_peer const* lhs, torrent_peer const* rhs bool compare_peer(torrent_peer const* lhs, torrent_peer const* rhs
, external_ip const& external, int source_port) const; , external_ip const& external, int source_port) const;
void find_connect_candidates(std::vector<torrent_peer*>& peers, int session_time, torrent_state* state); void find_connect_candidates(std::vector<torrent_peer*>& peers
, int session_time, torrent_state* state);
bool is_connect_candidate(torrent_peer const& p) const; bool is_connect_candidate(torrent_peer const& p) const;
bool is_erase_candidate(torrent_peer const& p) const; bool is_erase_candidate(torrent_peer const& p) const;
@ -255,6 +263,9 @@ namespace libtorrent
// port for them). // port for them).
int m_num_connect_candidates; int m_num_connect_candidates;
// if a peer has failed this many times or more, we don't consider
// it a connect candidate anymore.
int m_max_failcount;
}; };
} }

View File

@ -977,6 +977,12 @@ namespace libtorrent
return m_picker.get() != 0; return m_picker.get() != 0;
} }
void update_max_failcount()
{
if (!m_peer_list) return;
torrent_state st = get_policy_state();
m_peer_list->set_max_failcount(&st);
}
int num_known_peers() const { return m_peer_list ? m_peer_list->num_peers() : 0; } int num_known_peers() const { return m_peer_list ? m_peer_list->num_peers() : 0; }
int num_connect_candidates() const { return m_peer_list ? m_peer_list->num_connect_candidates() : 0; } int num_connect_candidates() const { return m_peer_list ? m_peer_list->num_connect_candidates() : 0; }

View File

@ -129,15 +129,25 @@ namespace libtorrent
, m_finished(0) , m_finished(0)
, m_round_robin(0) , m_round_robin(0)
, m_num_connect_candidates(0) , m_num_connect_candidates(0)
, m_max_failcount(3)
{ {
thread_started(); thread_started();
} }
// disconnects and removes all peers that are now filtered void peer_list::set_max_failcount(torrent_state* state)
// fills in 'erased' with torrent_peer pointers that were removed {
// from the peer list. Any references to these peers must be cleared if (state->max_failcount == m_max_failcount) return;
// immediately after this call returns. For instance, in the piece picker.
void peer_list::apply_ip_filter(ip_filter const& filter, torrent_state* state, std::vector<address>& banned) m_max_failcount = state->max_failcount;
recalculate_connect_candidates(state);
}
// disconnects and removes all peers that are now filtered fills in 'erased'
// with torrent_peer pointers that were removed from the peer list. Any
// references to these peers must be cleared immediately after this call
// returns. For instance, in the piece picker.
void peer_list::apply_ip_filter(ip_filter const& filter
, torrent_state* state, std::vector<address>& banned)
{ {
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
INVARIANT_CHECK; INVARIANT_CHECK;
@ -169,7 +179,9 @@ namespace libtorrent
banned.push_back(p->remote().address()); banned.push_back(p->remote().address());
p->disconnect(errors::banned_by_ip_filter, peer_connection_interface::op_bittorrent); p->disconnect(errors::banned_by_ip_filter
, peer_connection_interface::op_bittorrent);
// what *i refers to has changed, i.e. cur was deleted // what *i refers to has changed, i.e. cur was deleted
if (m_peers.size() < count) if (m_peers.size() < count)
{ {
@ -196,7 +208,8 @@ namespace libtorrent
// fills in 'erased' with torrent_peer pointers that were removed // fills in 'erased' with torrent_peer pointers that were removed
// from the peer list. Any references to these peers must be cleared // from the peer list. Any references to these peers must be cleared
// immediately after this call returns. For instance, in the piece picker. // immediately after this call returns. For instance, in the piece picker.
void peer_list::apply_port_filter(port_filter const& filter, torrent_state* state, std::vector<address>& banned) void peer_list::apply_port_filter(port_filter const& filter
, torrent_state* state, std::vector<address>& banned)
{ {
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
INVARIANT_CHECK; INVARIANT_CHECK;
@ -457,14 +470,14 @@ namespace libtorrent
|| p.web_seed || p.web_seed
|| !p.connectable || !p.connectable
|| (p.seed && m_finished) || (p.seed && m_finished)
// TODO: 3 settings_pack::max_failcount should be used here, not 3 || int(p.failcount) >= m_max_failcount)
|| int(p.failcount) >= 3)
return false; return false;
return true; return true;
} }
void peer_list::find_connect_candidates(std::vector<torrent_peer*>& peers, int session_time, torrent_state* state) void peer_list::find_connect_candidates(std::vector<torrent_peer*>& peers
, int session_time, torrent_state* state)
{ {
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
INVARIANT_CHECK; INVARIANT_CHECK;

View File

@ -5013,6 +5013,15 @@ retry:
i->second->update_auto_sequential(); i->second->update_auto_sequential();
} }
void session_impl::update_max_failcount()
{
for (torrent_map::iterator i = m_torrents.begin()
, end(m_torrents.end()); i != end; ++i)
{
i->second->update_max_failcount();
}
}
void session_impl::update_proxy() void session_impl::update_proxy()
{ {
// in case we just set a socks proxy, we might have to // in case we just set a socks proxy, we might have to

View File

@ -229,7 +229,7 @@ namespace libtorrent
SET(urlseed_pipeline_size, 5, 0), SET(urlseed_pipeline_size, 5, 0),
SET(urlseed_wait_retry, 30, 0), SET(urlseed_wait_retry, 30, 0),
SET(file_pool_size, 40, 0), SET(file_pool_size, 40, 0),
SET(max_failcount, 3, 0), SET(max_failcount, 3, &session_impl::update_max_failcount),
SET(min_reconnect_time, 60, 0), SET(min_reconnect_time, 60, 0),
SET(peer_connect_timeout, 15, 0), SET(peer_connect_timeout, 15, 0),
SET(connection_speed, 6, &session_impl::update_connection_speed), SET(connection_speed, 6, &session_impl::update_connection_speed),

View File

@ -10639,6 +10639,7 @@ namespace libtorrent
ret.peer_allocator = m_ses.get_peer_allocator(); ret.peer_allocator = m_ses.get_peer_allocator();
ret.ip = &m_ses.external_address(); ret.ip = &m_ses.external_address();
ret.port = m_ses.listen_port(); ret.port = m_ses.listen_port();
ret.max_failcount = settings().get_int(settings_pack::max_failcount);
return ret; return ret;
} }