improve logging of adding peers and the state of torrents. the default flags for the external connect_peer() call now assumes encryption, uTP and holepunch support

This commit is contained in:
arvidn 2015-07-12 14:08:04 -04:00
parent efebbcb2bf
commit a65b71b855
6 changed files with 86 additions and 23 deletions

View File

@ -56,7 +56,7 @@ namespace libtorrent
// in the other end. In the case of a web seed, the server type and // in the other end. In the case of a web seed, the server type and
// version will be a part of this string. // version will be a part of this string.
std::string client; std::string client;
// a bitfield, with one bit per piece in the torrent. Each bit tells you // a bitfield, with one bit per piece in the torrent. Each bit tells you
// if the peer has that piece (if it's set to 1) or if the peer miss that // if the peer has that piece (if it's set to 1) or if the peer miss that
// piece (set to 0). // piece (set to 0).
@ -179,7 +179,7 @@ namespace libtorrent
// this connection is obfuscated with RC4 // this connection is obfuscated with RC4
rc4_encrypted = 0x100000, rc4_encrypted = 0x100000,
// the handshake of this connection was obfuscated // the handshake of this connection was obfuscated
// with a diffie-hellman exchange // with a diffie-hellman exchange
plaintext_encrypted = 0x200000 plaintext_encrypted = 0x200000
@ -210,7 +210,7 @@ namespace libtorrent
// The peer was added from the fast resume data. // The peer was added from the fast resume data.
resume_data = 0x10, resume_data = 0x10,
// we received an incoming connection from this peer // we received an incoming connection from this peer
incoming = 0x20 incoming = 0x20
}; };
@ -261,7 +261,7 @@ namespace libtorrent
// this is the number of requests we have sent to this peer that we // this is the number of requests we have sent to this peer that we
// haven't got a response for yet // haven't got a response for yet
int download_queue_length; int download_queue_length;
// the number of block requests that have timed out, and are still in the // the number of block requests that have timed out, and are still in the
// download queue // download queue
int timed_out_requests; int timed_out_requests;
@ -301,7 +301,7 @@ namespace libtorrent
int downloading_block_index; int downloading_block_index;
int downloading_progress; int downloading_progress;
int downloading_total; int downloading_total;
// the kind of connection this is. Used for the connection_type field. // the kind of connection this is. Used for the connection_type field.
enum connection_type_t enum connection_type_t
{ {
@ -317,7 +317,7 @@ namespace libtorrent
// the kind of connection this peer uses. See connection_type_t. // the kind of connection this peer uses. See connection_type_t.
int connection_type; int connection_type;
// an estimate of the rate this peer is downloading at, in // an estimate of the rate this peer is downloading at, in
// bytes per second. // bytes per second.
int remote_dl_rate; int remote_dl_rate;

View File

@ -1096,20 +1096,20 @@ namespace libtorrent
// ``flags`` are the same flags that are passed along with the ``ut_pex`` extension. // ``flags`` are the same flags that are passed along with the ``ut_pex`` extension.
// //
// ==== ========================================== // ==== ==========================================
// 0x01 peer supports encryption // 0x01 peer supports encryption.
// //
// 0x02 peer is a seed // 0x02 peer is a seed
// //
// 0x04 supports uTP. This is only a positive flags // 0x04 supports uTP. If this is not set, the peer will only be contacted
// passing 0 doesn't mean the peer doesn't // over TCP.
// support uTP
// //
// 0x08 supports holepunching protocol. If this // 0x08 supports holepunching protocol. If this
// flag is received from a peer, it can be // flag is received from a peer, it can be
// used as a rendezvous point in case direct // used as a rendezvous point in case direct
// connections to the peer fail // connections to the peer fail
// ==== ========================================== // ==== ==========================================
void connect_peer(tcp::endpoint const& adr, int source = 0, int flags = 0) const; void connect_peer(tcp::endpoint const& adr, int source = 0
, int flags = 0x1 + 0x4 + 0x8) const;
// ``set_max_uploads()`` sets the maximum number of peers that's unchoked // ``set_max_uploads()`` sets the maximum number of peers that's unchoked
// at the same time on this torrent. If you set this to -1, there will be // at the same time on this torrent. If you set this to -1, there will be

View File

@ -62,6 +62,10 @@ namespace libtorrent
tcp::endpoint ip() const { return tcp::endpoint(address(), port); } tcp::endpoint ip() const { return tcp::endpoint(address(), port); }
#ifndef TORRENT_DISABLE_LOGGING
std::string to_string() const;
#endif
// this is the accumulated amount of // this is the accumulated amount of
// uploaded and downloaded data to this // uploaded and downloaded data to this
// torrent_peer. It only accounts for what was // torrent_peer. It only accounts for what was

View File

@ -897,7 +897,8 @@ namespace libtorrent
} }
// this is an internal function // this is an internal function
bool peer_list::insert_peer(torrent_peer* p, iterator iter, int flags, torrent_state* state) bool peer_list::insert_peer(torrent_peer* p, iterator iter, int flags
, torrent_state* state)
{ {
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
TORRENT_ASSERT(p); TORRENT_ASSERT(p);

View File

@ -346,12 +346,6 @@ namespace libtorrent
m_resume_data.reset(new resume_data_t); m_resume_data.reset(new resume_data_t);
m_resume_data->buf = p.resume_data; m_resume_data->buf = p.resume_data;
} }
update_want_peers();
update_want_scrape();
update_want_tick();
update_state_list();
} }
void torrent::inc_stats_counter(int c, int value) void torrent::inc_stats_counter(int c, int value)
@ -710,8 +704,6 @@ namespace libtorrent
{ {
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
INVARIANT_CHECK;
#ifndef TORRENT_DISABLE_LOGGING #ifndef TORRENT_DISABLE_LOGGING
debug_log("creating torrent: %s max-uploads: %d max-connections: %d " debug_log("creating torrent: %s max-uploads: %d max-connections: %d "
"upload-limit: %d download-limit: %d flags: %s%s%s%s%s%s%s%s%s%s%s%s" "upload-limit: %d download-limit: %d flags: %s%s%s%s%s%s%s%s%s%s%s%s"
@ -822,6 +814,11 @@ namespace libtorrent
} }
} }
update_want_peers();
update_want_scrape();
update_want_tick();
update_state_list();
if (!m_torrent_file->is_valid() && !m_url.empty()) if (!m_torrent_file->is_valid() && !m_url.empty())
{ {
// we need to download the .torrent file from m_url // we need to download the .torrent file from m_url
@ -838,6 +835,10 @@ namespace libtorrent
set_state(torrent_status::downloading_metadata); set_state(torrent_status::downloading_metadata);
start_announcing(); start_announcing();
} }
#if TORRENT_USE_INVARIANT_CHECKS
check_invariant();
#endif
} }
void torrent::start_download_url() void torrent::start_download_url()
@ -7393,7 +7394,15 @@ namespace libtorrent
sm = m_ses.utp_socket_manager(); sm = m_ses.utp_socket_manager();
// don't make a TCP connection if it's disabled // don't make a TCP connection if it's disabled
if (sm == 0 && !settings().get_bool(settings_pack::enable_outgoing_tcp)) return false; if (sm == 0 && !settings().get_bool(settings_pack::enable_outgoing_tcp))
{
#ifndef TORRENT_DISABLE_LOGGING
debug_log("discarding peer \"%s\": TCP connections disabled "
"[ supports-utp: %d ]", peerinfo->to_string().c_str()
, peerinfo->supports_utp);
#endif
return false;
}
void* userdata = 0; void* userdata = 0;
#ifdef TORRENT_USE_OPENSSL #ifdef TORRENT_USE_OPENSSL
@ -7998,10 +8007,29 @@ namespace libtorrent
, !m_allow_peers && m_auto_managed && !m_abort); , !m_allow_peers && m_auto_managed && !m_abort);
} }
char const* list_name(int idx)
{
#define TORRENT_LIST_NAME(n) case aux::session_interface:: n: return #n;
switch (idx)
{
TORRENT_LIST_NAME(torrent_state_updates);
TORRENT_LIST_NAME(torrent_want_tick);
TORRENT_LIST_NAME(torrent_want_peers_download);
TORRENT_LIST_NAME(torrent_want_peers_finished);
TORRENT_LIST_NAME(torrent_want_scrape);
TORRENT_LIST_NAME(torrent_downloading_auto_managed);
TORRENT_LIST_NAME(torrent_seeding_auto_managed);
TORRENT_LIST_NAME(torrent_checking_auto_managed);
default: TORRENT_ASSERT_VAL(false, idx);
}
#undef TORRENT_LIST_NAME
}
void torrent::update_list(int list, bool in) void torrent::update_list(int list, bool in)
{ {
link& l = m_links[list]; link& l = m_links[list];
std::vector<torrent*>& v = m_ses.torrent_list(list); std::vector<torrent*>& v = m_ses.torrent_list(list);
if (in) if (in)
{ {
if (l.in_list()) return; if (l.in_list()) return;
@ -8012,6 +8040,10 @@ namespace libtorrent
if (!l.in_list()) return; if (!l.in_list()) return;
l.unlink(v, list); l.unlink(v, list);
} }
#ifndef TORRENT_DISABLE_LOGGING
debug_log("*** UPDATE LIST [ %s : %d ]", list_name(list), int(in));
#endif
} }
void torrent::disconnect_all(error_code const& ec, operation_t op) void torrent::disconnect_all(error_code const& ec, operation_t op)
@ -10904,7 +10936,15 @@ namespace libtorrent
TORRENT_ASSERT(is_single_thread()); TORRENT_ASSERT(is_single_thread());
#if !TORRENT_USE_IPV6 #if !TORRENT_USE_IPV6
if (!adr.address().is_v4()) return NULL; if (!adr.address().is_v4())
{
#ifndef TORRENT_DISABLE_LOGGING
error_code ec;
debug_log("add_peer() %s unsupported address family"
, adr.address().to_string(ec).c_str());
#endif
return NULL;
}
#endif #endif
#ifndef TORRENT_DISABLE_DHT #ifndef TORRENT_DISABLE_DHT
@ -10912,7 +10952,7 @@ namespace libtorrent
{ {
// try to send a DHT ping to this peer // try to send a DHT ping to this peer
// as well, to figure out if it supports // as well, to figure out if it supports
// DHT (uTorrent and BitComet doesn't // DHT (uTorrent and BitComet don't
// advertise support) // advertise support)
udp::endpoint node(adr.address(), adr.port()); udp::endpoint node(adr.address(), adr.port());
session().add_dht_node(node); session().add_dht_node(node);
@ -10971,6 +11011,13 @@ namespace libtorrent
torrent_state st = get_peer_list_state(); torrent_state st = get_peer_list_state();
torrent_peer* p = m_peer_list->add_peer(adr, source, flags, &st); torrent_peer* p = m_peer_list->add_peer(adr, source, flags, &st);
peers_erased(st.erased); peers_erased(st.erased);
#ifndef TORRENT_DISABLE_LOGGING
error_code ec;
debug_log("add_peer() %s connect-candidates: %d"
, adr.address().to_string(ec).c_str(), m_peer_list->num_connect_candidates());
#endif
if (p) if (p)
{ {
state_updated(); state_updated();

View File

@ -184,6 +184,17 @@ namespace libtorrent
return peer_rank; return peer_rank;
} }
#ifndef TORRENT_DISABLE_LOGGING
std::string torrent_peer::to_string() const
{
#if TORRENT_USE_I2P
if (is_i2p_addr) return dest();
#endif // TORRENT_USE_I2P
error_code ec;
return address().to_string(ec);
}
#endif
boost::uint64_t torrent_peer::total_download() const boost::uint64_t torrent_peer::total_download() const
{ {
if (connection != 0) if (connection != 0)