more quota management fixes and more stats for web seeds
This commit is contained in:
parent
0abb46e794
commit
c5cf290f49
|
@ -1,3 +1,6 @@
|
|||
* Modified the quota management to offer better bandwidth balancing
|
||||
between peers.
|
||||
* added XCode project files (maintained by Gregor Riepl)
|
||||
* logging now supports multiple sessions (different sessions now log
|
||||
to different directories).
|
||||
* fixed random number generator seed problem, generating the same
|
||||
|
|
|
@ -175,7 +175,7 @@ namespace libtorrent
|
|||
// the number of consumer that saturated their
|
||||
// quota last time slice
|
||||
int num_saturated = 0;
|
||||
// the total resources those that saturated their
|
||||
// the total resources that those saturated their
|
||||
// quota used. This is used to calculate the mean
|
||||
// of the saturating consumers, in order to
|
||||
// balance their quotas for the next time slice.
|
||||
|
@ -238,7 +238,7 @@ namespace libtorrent
|
|||
{
|
||||
assert(num_saturated > 0);
|
||||
target = div_round_up(saturated_sum, num_saturated);
|
||||
target += div_round_up(target, 10);
|
||||
target += div_round_up(target, 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -247,8 +247,8 @@ namespace libtorrent
|
|||
if (target > r.max) target = r.max;
|
||||
else if (target < r.min) target = r.min;
|
||||
|
||||
// move 50% towards the the target value
|
||||
r.used = r.given + div_round_up(target - r.given, 2);
|
||||
// move 12.5% towards the the target value
|
||||
r.used = r.given + div_round_up(target - r.given, 8);
|
||||
r.given = r.min;
|
||||
}
|
||||
|
||||
|
|
|
@ -501,6 +501,10 @@ namespace libtorrent
|
|||
// it's updated from all its peers once every second.
|
||||
libtorrent::stat m_stat;
|
||||
|
||||
// this is the stats for web seeds in this torrent only. It is updated
|
||||
// once every second.
|
||||
libtorrent::stat m_web_stat;
|
||||
|
||||
// -----------------------------
|
||||
|
||||
boost::shared_ptr<policy> m_policy;
|
||||
|
@ -614,6 +618,7 @@ namespace libtorrent
|
|||
|
||||
#ifdef TORRENT_LOGGING
|
||||
boost::shared_ptr<logger> m_log;
|
||||
boost::shared_ptr<logger> m_peer_log;
|
||||
int m_second_count;
|
||||
|
||||
enum { debug_bw_history_size = 10 };
|
||||
|
|
|
@ -82,6 +82,7 @@ namespace libtorrent
|
|||
{
|
||||
tracker_request()
|
||||
: kind(announce_request)
|
||||
, web_downloaded(0)
|
||||
, event(none)
|
||||
, key(0)
|
||||
, num_want(0)
|
||||
|
@ -106,6 +107,7 @@ namespace libtorrent
|
|||
size_type downloaded;
|
||||
size_type uploaded;
|
||||
size_type left;
|
||||
size_type web_downloaded;
|
||||
unsigned short listen_port;
|
||||
event_t event;
|
||||
std::string url;
|
||||
|
|
|
@ -322,6 +322,12 @@ namespace libtorrent
|
|||
m_send_buffer += "&left=";
|
||||
m_send_buffer += boost::lexical_cast<std::string>(req.left);
|
||||
|
||||
if (req.web_downloaded > 0)
|
||||
{
|
||||
m_send_buffer += "&http_downloaded=";
|
||||
m_send_buffer += boost::lexical_cast<std::string>(req.web_downloaded);
|
||||
}
|
||||
|
||||
if (req.event != tracker_request::none)
|
||||
{
|
||||
const char* event_string[] = {"completed", "started", "stopped"};
|
||||
|
|
|
@ -141,8 +141,22 @@ namespace libtorrent
|
|||
}
|
||||
else
|
||||
{
|
||||
// just enough to get started with the handshake and bitmask
|
||||
m_ul_bandwidth_quota.given = 400;
|
||||
if (t->num_peers() == 0)
|
||||
{
|
||||
// just enough to get started with the handshake and bitmask
|
||||
m_ul_bandwidth_quota.given = 400;
|
||||
}
|
||||
else
|
||||
{
|
||||
// set the limit of this new connection to the mean of the other connections
|
||||
size_type total_ul_given = 0;
|
||||
for (torrent::peer_iterator i = t->begin()
|
||||
, end(t->end()); i != end; ++i)
|
||||
{
|
||||
total_ul_given += i->second->m_ul_bandwidth_quota.given;
|
||||
}
|
||||
m_ul_bandwidth_quota.given = total_ul_given / t->num_peers();
|
||||
}
|
||||
}
|
||||
|
||||
m_dl_bandwidth_quota.min = 10;
|
||||
|
@ -154,8 +168,22 @@ namespace libtorrent
|
|||
}
|
||||
else
|
||||
{
|
||||
// just enough to get started with the handshake and bitmask
|
||||
m_dl_bandwidth_quota.given = 400;
|
||||
if (t->num_peers() == 0)
|
||||
{
|
||||
// just enough to get started with the handshake and bitmask
|
||||
m_dl_bandwidth_quota.given = 400;
|
||||
}
|
||||
else
|
||||
{
|
||||
// set the limit of this new connection to the mean of the other connections
|
||||
size_type total_dl_given = 0;
|
||||
for (torrent::peer_iterator i = t->begin()
|
||||
, end(t->end()); i != end; ++i)
|
||||
{
|
||||
total_dl_given += i->second->m_dl_bandwidth_quota.given;
|
||||
}
|
||||
m_dl_bandwidth_quota.given = total_dl_given / t->num_peers();
|
||||
}
|
||||
}
|
||||
|
||||
std::fill(m_peer_id.begin(), m_peer_id.end(), 0);
|
||||
|
@ -230,29 +258,11 @@ namespace libtorrent
|
|||
|
||||
m_ul_bandwidth_quota.min = 10;
|
||||
m_ul_bandwidth_quota.max = resource_request::inf;
|
||||
|
||||
if (m_ses.m_upload_rate == -1)
|
||||
{
|
||||
m_ul_bandwidth_quota.given = resource_request::inf;
|
||||
}
|
||||
else
|
||||
{
|
||||
// just enough to get started with the handshake and bitmask
|
||||
m_ul_bandwidth_quota.given = 400;
|
||||
}
|
||||
m_ul_bandwidth_quota.given = 400;
|
||||
|
||||
m_dl_bandwidth_quota.min = 10;
|
||||
m_dl_bandwidth_quota.max = resource_request::inf;
|
||||
|
||||
if (m_ses.m_download_rate == -1)
|
||||
{
|
||||
m_dl_bandwidth_quota.given = resource_request::inf;
|
||||
}
|
||||
else
|
||||
{
|
||||
// just enough to get started with the handshake and bitmask
|
||||
m_dl_bandwidth_quota.given = 400;
|
||||
}
|
||||
m_dl_bandwidth_quota.given = 400;
|
||||
|
||||
std::fill(m_peer_id.begin(), m_peer_id.end(), 0);
|
||||
}
|
||||
|
|
|
@ -207,6 +207,8 @@ namespace
|
|||
<< "14. bytes sent 10 seconds mean\n"
|
||||
<< "15. bytes received\n"
|
||||
<< "16. bytes received 10 seconds mean\n"
|
||||
<< "17. total payload download\n"
|
||||
<< "18. total web seed payload download\n"
|
||||
<< "\n";
|
||||
}
|
||||
#endif
|
||||
|
@ -276,6 +278,11 @@ namespace libtorrent
|
|||
m_second_count = 0;
|
||||
std::fill_n(m_ul_history, 10, 0);
|
||||
std::fill_n(m_dl_history, 10, 0);
|
||||
|
||||
m_peer_log = ses.create_log("torrent_peers_"
|
||||
+ boost::lexical_cast<std::string>(tf.info_hash())
|
||||
, m_ses.listen_port(), false);
|
||||
|
||||
#endif
|
||||
INVARIANT_CHECK;
|
||||
|
||||
|
@ -1031,6 +1038,7 @@ namespace libtorrent
|
|||
req.info_hash = m_torrent_file.info_hash();
|
||||
req.pid = m_ses.get_peer_id();
|
||||
req.downloaded = m_stat.total_payload_download();
|
||||
req.web_downloaded = m_web_stat.total_payload_download();
|
||||
req.uploaded = m_stat.total_payload_upload();
|
||||
req.left = bytes_left();
|
||||
if (req.left == -1) req.left = 16*1024;
|
||||
|
@ -1170,6 +1178,12 @@ namespace libtorrent
|
|||
|
||||
tcp::endpoint a(host->endpoint());
|
||||
|
||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||
{
|
||||
// TODO: post alert: "web seed at " + a.address().to_string() + " blocked by ip filter");
|
||||
return;
|
||||
}
|
||||
|
||||
boost::shared_ptr<stream_socket> s(new stream_socket(m_ses.m_selector));
|
||||
boost::intrusive_ptr<peer_connection> c(new web_peer_connection(
|
||||
m_ses, shared_from_this(), s, a, url));
|
||||
|
@ -1225,6 +1239,9 @@ namespace libtorrent
|
|||
{
|
||||
INVARIANT_CHECK;
|
||||
|
||||
if (m_ses.m_ip_filter.access(a.address()) & ip_filter::blocked)
|
||||
throw protocol_error(a.address().to_string() + " blocked by ip filter");
|
||||
|
||||
if (m_connections.find(a) != m_connections.end())
|
||||
throw protocol_error("already connected to peer");
|
||||
|
||||
|
@ -1772,6 +1789,7 @@ namespace libtorrent
|
|||
{
|
||||
// let the stats fade out to 0
|
||||
m_stat.second_tick(tick_interval);
|
||||
m_web_stat.second_tick(tick_interval);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1812,6 +1830,10 @@ namespace libtorrent
|
|||
{
|
||||
peer_connection* p = i->second;
|
||||
m_stat += p->statistics();
|
||||
if (dynamic_cast<web_peer_connection*>(p))
|
||||
{
|
||||
m_web_stat += p->statistics();
|
||||
}
|
||||
// updates the peer connection's ul/dl bandwidth
|
||||
// resource requests
|
||||
p->second_tick(tick_interval);
|
||||
|
@ -1844,6 +1866,7 @@ namespace libtorrent
|
|||
|
||||
accumulator += m_stat;
|
||||
m_stat.second_tick(tick_interval);
|
||||
m_web_stat.second_tick(tick_interval);
|
||||
}
|
||||
|
||||
void torrent::distribute_resources(float tick_interval)
|
||||
|
@ -1890,9 +1913,9 @@ namespace libtorrent
|
|||
m_excess_dl = std::max(m_excess_dl, -10000);
|
||||
|
||||
int ul_to_distribute = std::max(int((m_ul_bandwidth_quota.given
|
||||
- m_excess_ul) * 1.6f), 0);
|
||||
- m_excess_ul * 0.7f) * 1.6f), 0);
|
||||
int dl_to_distribute = std::max(int((m_dl_bandwidth_quota.given
|
||||
- m_excess_dl) * 1.6f), 0);
|
||||
- m_excess_dl * 0.7f) * 1.6f), 0);
|
||||
|
||||
#ifdef TORRENT_LOGGING
|
||||
std::copy(m_ul_history + 1, m_ul_history + debug_bw_history_size, m_ul_history);
|
||||
|
@ -1924,6 +1947,8 @@ namespace libtorrent
|
|||
<< mean_ul << "\t"
|
||||
<< dl_used << "\t"
|
||||
<< mean_dl << "\t"
|
||||
<< m_stat.total_payload_download() << "\t"
|
||||
<< m_web_stat.total_payload_download() << "\t"
|
||||
<< "\n";
|
||||
|
||||
(*m_log)
|
||||
|
@ -1939,6 +1964,20 @@ namespace libtorrent
|
|||
<< num_peers() << "\t"
|
||||
<< ul_max << "\t"
|
||||
<< dl_max << "\t";
|
||||
|
||||
(*m_peer_log) << m_second_count << "\t";
|
||||
for (peer_iterator i = m_connections.begin();
|
||||
i != m_connections.end(); ++i)
|
||||
{
|
||||
int given = i->second->m_dl_bandwidth_quota.given;
|
||||
(*m_peer_log) << (given == resource_request::inf ? -1 : given)
|
||||
<< "\t" << i->second->m_dl_bandwidth_quota.used << "\t";
|
||||
}
|
||||
for (int i = m_connections.size(); i < 10; ++i)
|
||||
{
|
||||
(*m_peer_log) << 0 << "\t" << 0 << "\t";
|
||||
}
|
||||
(*m_peer_log) << "\n";
|
||||
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue