forked from premiere/premiere-libtorrent
report tracker bandwidth usage and include it in rate limiter
This commit is contained in:
parent
48dad0e2ac
commit
1ac3b8298c
|
@ -539,6 +539,11 @@ struct has the following members::
|
|||
size_type total_dht_download;
|
||||
size_type total_dht_upload;
|
||||
|
||||
float tracker_upload_rate;
|
||||
float tracker_download_rate;
|
||||
size_type total_tracker_download;
|
||||
size_type total_tracker_upload;
|
||||
|
||||
size_type total_redundant_bytes;
|
||||
size_type total_failed_bytes;
|
||||
|
||||
|
|
|
@ -1370,7 +1370,10 @@ int main(int ac, char* av[])
|
|||
<< esc("31") << add_suffix(sess_stat.ip_overhead_upload_rate) << "/s" << esc("0")
|
||||
<< " DHT: "
|
||||
<< esc("32") << add_suffix(sess_stat.dht_download_rate) << "/s" << esc("0") << " "
|
||||
<< esc("31") << add_suffix(sess_stat.dht_upload_rate) << "/s" << esc("0") << " ====\n"
|
||||
<< esc("31") << add_suffix(sess_stat.dht_upload_rate) << "/s" << esc("0")
|
||||
<< " tracker: "
|
||||
<< esc("32") << add_suffix(sess_stat.tracker_download_rate) << "/s" << esc("0") << " "
|
||||
<< esc("31") << add_suffix(sess_stat.tracker_upload_rate) << "/s" << esc("0") << " ====\n"
|
||||
"==== waste: " << add_suffix(sess_stat.total_redundant_bytes)
|
||||
<< " fail: " << add_suffix(sess_stat.total_failed_bytes)
|
||||
<< " unchoked: " << sess_stat.num_unchoked << " / " << sess_stat.allowed_upload_slots
|
||||
|
|
|
@ -74,6 +74,11 @@ namespace libtorrent
|
|||
size_type total_dht_download;
|
||||
size_type total_dht_upload;
|
||||
|
||||
float tracker_upload_rate;
|
||||
float tracker_download_rate;
|
||||
size_type total_tracker_download;
|
||||
size_type total_tracker_upload;
|
||||
|
||||
size_type total_redundant_bytes;
|
||||
size_type total_failed_bytes;
|
||||
|
||||
|
|
|
@ -126,12 +126,28 @@ namespace libtorrent
|
|||
{
|
||||
TORRENT_ASSERT(bytes >= 0);
|
||||
m_stat[download_dht_protocol].add(bytes);
|
||||
// assuming IPv4 and UDP headers
|
||||
m_stat[download_ip_protocol].add(28);
|
||||
}
|
||||
|
||||
void sent_dht_bytes(int bytes)
|
||||
{
|
||||
TORRENT_ASSERT(bytes >= 0);
|
||||
m_stat[upload_dht_protocol].add(bytes);
|
||||
// assuming IPv4 and UDP headers
|
||||
m_stat[upload_ip_protocol].add(28);
|
||||
}
|
||||
|
||||
void received_tracker_bytes(int bytes)
|
||||
{
|
||||
TORRENT_ASSERT(bytes >= 0);
|
||||
m_stat[download_tracker_protocol].add(bytes);
|
||||
}
|
||||
|
||||
void sent_tracker_bytes(int bytes)
|
||||
{
|
||||
TORRENT_ASSERT(bytes >= 0);
|
||||
m_stat[upload_tracker_protocol].add(bytes);
|
||||
}
|
||||
|
||||
void received_bytes(int bytes_payload, int bytes_protocol)
|
||||
|
@ -176,6 +192,8 @@ namespace libtorrent
|
|||
int download_ip_overhead() const { return m_stat[download_ip_protocol].counter(); }
|
||||
int upload_dht() const { return m_stat[upload_dht_protocol].counter(); }
|
||||
int download_dht() const { return m_stat[download_dht_protocol].counter(); }
|
||||
int download_tracker() const { return m_stat[download_tracker_protocol].counter(); }
|
||||
int upload_tracker() const { return m_stat[upload_tracker_protocol].counter(); }
|
||||
|
||||
// should be called once every second
|
||||
void second_tick(float tick_interval)
|
||||
|
@ -207,7 +225,8 @@ namespace libtorrent
|
|||
return m_stat[upload_payload].total()
|
||||
+ m_stat[upload_protocol].total()
|
||||
+ m_stat[upload_ip_protocol].total()
|
||||
+ m_stat[upload_dht_protocol].total();
|
||||
+ m_stat[upload_dht_protocol].total()
|
||||
+ m_stat[upload_tracker_protocol].total();
|
||||
}
|
||||
|
||||
size_type total_download() const
|
||||
|
@ -215,7 +234,8 @@ namespace libtorrent
|
|||
return m_stat[download_payload].total()
|
||||
+ m_stat[download_protocol].total()
|
||||
+ m_stat[download_ip_protocol].total()
|
||||
+ m_stat[download_dht_protocol].total();
|
||||
+ m_stat[download_dht_protocol].total()
|
||||
+ m_stat[download_tracker_protocol].total();
|
||||
}
|
||||
|
||||
float upload_payload_rate() const
|
||||
|
@ -265,10 +285,12 @@ namespace libtorrent
|
|||
upload_protocol,
|
||||
upload_ip_protocol,
|
||||
upload_dht_protocol,
|
||||
upload_tracker_protocol,
|
||||
download_payload,
|
||||
download_protocol,
|
||||
download_ip_protocol,
|
||||
download_dht_protocol,
|
||||
download_tracker_protocol,
|
||||
num_channels
|
||||
};
|
||||
|
||||
|
|
|
@ -70,6 +70,7 @@ namespace libtorrent
|
|||
class tracker_manager;
|
||||
struct timeout_handler;
|
||||
struct tracker_connection;
|
||||
namespace aux { struct session_impl; }
|
||||
|
||||
// returns -1 if gzip header is invalid or the header size in bytes
|
||||
TORRENT_EXPORT int gzip_header(const char* buf, int size);
|
||||
|
@ -197,6 +198,8 @@ namespace libtorrent
|
|||
virtual void start() = 0;
|
||||
virtual void close();
|
||||
address const& bind_interface() const { return m_bind_interface; }
|
||||
void sent_bytes(int bytes);
|
||||
void received_bytes(int bytes);
|
||||
|
||||
protected:
|
||||
boost::weak_ptr<request_callback> m_requester;
|
||||
|
@ -210,8 +213,8 @@ namespace libtorrent
|
|||
{
|
||||
public:
|
||||
|
||||
tracker_manager(session_settings const& s, proxy_settings const& ps)
|
||||
: m_settings(s)
|
||||
tracker_manager(aux::session_impl& ses, proxy_settings const& ps)
|
||||
: m_ses(ses)
|
||||
, m_proxy(ps)
|
||||
, m_abort(false) {}
|
||||
|
||||
|
@ -228,6 +231,9 @@ namespace libtorrent
|
|||
void remove_request(tracker_connection const*);
|
||||
bool empty() const;
|
||||
int num_requests() const;
|
||||
|
||||
void sent_bytes(int bytes);
|
||||
void received_bytes(int bytes);
|
||||
|
||||
private:
|
||||
|
||||
|
@ -237,7 +243,7 @@ namespace libtorrent
|
|||
typedef std::list<boost::intrusive_ptr<tracker_connection> >
|
||||
tracker_connections_t;
|
||||
tracker_connections_t m_connections;
|
||||
session_settings const& m_settings;
|
||||
aux::session_impl& m_ses;
|
||||
proxy_settings const& m_proxy;
|
||||
bool m_abort;
|
||||
};
|
||||
|
|
|
@ -182,6 +182,9 @@ namespace libtorrent
|
|||
m_tracker_connection->get(url, seconds(timeout)
|
||||
, 1, &m_ps, 5, m_settings.user_agent, m_bind_iface);
|
||||
|
||||
// the url + 100 estimated header size
|
||||
sent_bytes(url.size() + 100);
|
||||
|
||||
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
|
||||
|
||||
boost::shared_ptr<request_callback> cb = requester();
|
||||
|
@ -232,6 +235,8 @@ namespace libtorrent
|
|||
return;
|
||||
}
|
||||
|
||||
received_bytes(size + parser.body_start());
|
||||
|
||||
// handle tracker response
|
||||
entry e;
|
||||
e = bdecode(data, data + size);
|
||||
|
|
|
@ -155,7 +155,7 @@ namespace aux {
|
|||
#else
|
||||
, m_upload_channel(m_io_service, peer_connection::upload_channel)
|
||||
#endif
|
||||
, m_tracker_manager(m_settings, m_tracker_proxy)
|
||||
, m_tracker_manager(*this, m_tracker_proxy)
|
||||
, m_listen_port_retries(listen_port_range.second - listen_port_range.first)
|
||||
, m_listen_interface(address::from_string(listen_interface), listen_port_range.first)
|
||||
, m_abort(false)
|
||||
|
@ -1096,8 +1096,15 @@ namespace aux {
|
|||
}
|
||||
|
||||
// drain the IP overhead from the bandwidth limiters
|
||||
m_download_channel.drain(m_stat.download_ip_overhead() + m_stat.download_dht());
|
||||
m_upload_channel.drain(m_stat.upload_ip_overhead() + m_stat.upload_dht());
|
||||
m_download_channel.drain(
|
||||
m_stat.download_ip_overhead()
|
||||
+ m_stat.download_dht()
|
||||
+ m_stat.download_tracker());
|
||||
|
||||
m_upload_channel.drain(
|
||||
m_stat.upload_ip_overhead()
|
||||
+ m_stat.upload_dht()
|
||||
+ m_stat.upload_tracker());
|
||||
|
||||
m_stat.second_tick(tick_interval);
|
||||
|
||||
|
@ -2019,6 +2026,12 @@ namespace aux {
|
|||
s.dht_upload_rate = m_stat.transfer_rate(stat::upload_dht_protocol);
|
||||
s.total_dht_upload = m_stat.total_transfer(stat::upload_dht_protocol);
|
||||
|
||||
// tracker
|
||||
s.tracker_download_rate = m_stat.transfer_rate(stat::download_tracker_protocol);
|
||||
s.total_tracker_download = m_stat.total_transfer(stat::download_tracker_protocol);
|
||||
s.tracker_upload_rate = m_stat.transfer_rate(stat::upload_tracker_protocol);
|
||||
s.total_tracker_upload = m_stat.total_transfer(stat::upload_tracker_protocol);
|
||||
|
||||
#ifndef TORRENT_DISABLE_DHT
|
||||
if (m_dht)
|
||||
{
|
||||
|
|
|
@ -47,6 +47,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#include "libtorrent/bencode.hpp"
|
||||
#include "libtorrent/torrent.hpp"
|
||||
#include "libtorrent/peer_connection.hpp"
|
||||
#include "libtorrent/aux_/session_impl.hpp"
|
||||
|
||||
using namespace libtorrent;
|
||||
using boost::tuples::make_tuple;
|
||||
|
@ -156,6 +157,16 @@ namespace libtorrent
|
|||
close();
|
||||
}
|
||||
|
||||
void tracker_connection::sent_bytes(int bytes)
|
||||
{
|
||||
m_man.sent_bytes(bytes);
|
||||
}
|
||||
|
||||
void tracker_connection::received_bytes(int bytes)
|
||||
{
|
||||
m_man.received_bytes(bytes);
|
||||
}
|
||||
|
||||
void tracker_connection::fail_timeout()
|
||||
{
|
||||
boost::shared_ptr<request_callback> cb = requester();
|
||||
|
@ -169,6 +180,18 @@ namespace libtorrent
|
|||
m_man.remove_request(this);
|
||||
}
|
||||
|
||||
void tracker_manager::sent_bytes(int bytes)
|
||||
{
|
||||
aux::session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
||||
m_ses.m_stat.sent_tracker_bytes(bytes);
|
||||
}
|
||||
|
||||
void tracker_manager::received_bytes(int bytes)
|
||||
{
|
||||
aux::session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
||||
m_ses.m_stat.received_tracker_bytes(bytes);
|
||||
}
|
||||
|
||||
void tracker_manager::remove_request(tracker_connection const* c)
|
||||
{
|
||||
mutex_t::scoped_lock l(m_mutex);
|
||||
|
@ -209,13 +232,13 @@ namespace libtorrent
|
|||
{
|
||||
con = new http_tracker_connection(
|
||||
ios, cc, *this, req, bind_infc, c
|
||||
, m_settings, m_proxy, auth);
|
||||
, m_ses.settings(), m_proxy, auth);
|
||||
}
|
||||
else if (protocol == "udp")
|
||||
{
|
||||
con = new udp_tracker_connection(
|
||||
ios, cc, *this, req, bind_infc
|
||||
, c, m_settings, m_proxy);
|
||||
, c, m_ses.settings(), m_proxy);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -208,6 +208,7 @@ namespace libtorrent
|
|||
// ignore packet not sent from the tracker
|
||||
if (m_target != ep) return;
|
||||
|
||||
received_bytes(size + 28); // assuming UDP/IP header
|
||||
if (e) fail(-1, e.message().c_str());
|
||||
|
||||
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING
|
||||
|
@ -320,6 +321,7 @@ namespace libtorrent
|
|||
error_code ec;
|
||||
m_socket.send(m_target, buf, 16, ec);
|
||||
m_state = action_connect;
|
||||
sent_bytes(16 + 28); // assuming UDP/IP header
|
||||
++m_attempts;
|
||||
if (ec)
|
||||
{
|
||||
|
@ -349,6 +351,7 @@ namespace libtorrent
|
|||
error_code ec;
|
||||
m_socket.send(m_target, buf, sizeof(buf), ec);
|
||||
m_state = action_scrape;
|
||||
sent_bytes(sizeof(buf) + 28); // assuming UDP/IP header
|
||||
++m_attempts;
|
||||
if (ec)
|
||||
{
|
||||
|
@ -509,6 +512,7 @@ namespace libtorrent
|
|||
error_code ec;
|
||||
m_socket.send(m_target, buf, sizeof(buf), ec);
|
||||
m_state = action_announce;
|
||||
sent_bytes(sizeof(buf) + 28); // assuming UDP/IP header
|
||||
++m_attempts;
|
||||
if (ec)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue