rate limiter fix

This commit is contained in:
Arvid Norberg 2010-08-27 14:52:42 +00:00
parent 764b5864c6
commit e2ca3e1545
6 changed files with 24 additions and 10 deletions

View File

@ -41,6 +41,7 @@
incoming connection incoming connection
* added more detailed instrumentation of the disk I/O thread * added more detailed instrumentation of the disk I/O thread
* fixed limitation in rate limiter
* fixed build error with boost 1.44 * fixed build error with boost 1.44
0.15.2 release 0.15.2 release

View File

@ -793,6 +793,7 @@ int main(int argc, char* argv[])
" -H Don't start DHT\n" " -H Don't start DHT\n"
" -W <num peers> Set the max number of peers to keep in the peer list\n" " -W <num peers> Set the max number of peers to keep in the peer list\n"
" -N Do not attempt to use UPnP and NAT-PMP to forward ports\n" " -N Do not attempt to use UPnP and NAT-PMP to forward ports\n"
" -Y Rate limit local peers\n"
" " " "
"\n\n" "\n\n"
"TORRENT is a path to a .torrent file\n" "TORRENT is a path to a .torrent file\n"
@ -989,6 +990,7 @@ int main(int argc, char* argv[])
break; break;
case 'I': outgoing_interface = arg; break; case 'I': outgoing_interface = arg; break;
case 'N': start_upnp = false; --i; break; case 'N': start_upnp = false; --i; break;
case 'Y': settings.ignore_limits_on_local_network = false; --i; break;
} }
++i; // skip the argument ++i; // skip the argument
} }

View File

@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE.
#define TORRENT_BANDWIDTH_CHANNEL_HPP_INCLUDED #define TORRENT_BANDWIDTH_CHANNEL_HPP_INCLUDED
#include <boost/integer_traits.hpp> #include <boost/integer_traits.hpp>
#include <boost/cstdint.hpp>
#include "libtorrent/assert.hpp" #include "libtorrent/assert.hpp"
@ -70,11 +71,11 @@ private:
// this is the amount of bandwidth we have // this is the amount of bandwidth we have
// been assigned without using yet. // been assigned without using yet.
int m_quota_left; boost::int64_t m_quota_left;
// the limit is the number of bytes // the limit is the number of bytes
// per second we are allowed to use. // per second we are allowed to use.
int m_limit; boost::int64_t m_limit;
}; };
} }

View File

@ -52,7 +52,7 @@ namespace libtorrent
int bandwidth_channel::quota_left() const int bandwidth_channel::quota_left() const
{ {
if (m_limit == 0) return inf; if (m_limit == 0) return inf;
return (std::max)(m_quota_left, 0); return (std::max)(m_quota_left, boost::int64_t(0));
} }
void bandwidth_channel::update_quota(int dt_milliseconds) void bandwidth_channel::update_quota(int dt_milliseconds)
@ -60,9 +60,10 @@ namespace libtorrent
if (m_limit == 0) return; if (m_limit == 0) return;
m_quota_left += (m_limit * dt_milliseconds + 500) / 1000; m_quota_left += (m_limit * dt_milliseconds + 500) / 1000;
if (m_quota_left > m_limit * 3) m_quota_left = m_limit * 3; if (m_quota_left > m_limit * 3) m_quota_left = m_limit * 3;
distribute_quota = (std::max)(m_quota_left, 0); distribute_quota = (std::max)(m_quota_left, boost::int64_t(0));
// fprintf(stderr, "%p: [%d]: + %d limit: %d\n", this // fprintf(stderr, "%p: [%d]: + %"PRId64" limit: %"PRId64" quota_left: %"PRId64"\n", this
// , dt_milliseconds, (m_limit * dt_milliseconds + 500) / 1000, m_limit); // , dt_milliseconds, (m_limit * dt_milliseconds + 500) / 1000, m_limit
// , m_quota_left);
} }
// this is used when connections disconnect with // this is used when connections disconnect with
@ -81,6 +82,9 @@ namespace libtorrent
TORRENT_ASSERT(amount >= 0); TORRENT_ASSERT(amount >= 0);
TORRENT_ASSERT(m_limit >= 0); TORRENT_ASSERT(m_limit >= 0);
if (m_limit == 0) return; if (m_limit == 0) return;
// fprintf(stderr, "%p: - %"PRId64" limit: %"PRId64" quota_left: %"PRId64"\n", this
// , amount, m_limit, m_quota_left);
m_quota_left -= amount; m_quota_left -= amount;
} }

View File

@ -4179,7 +4179,9 @@ namespace libtorrent
// peers that we are not interested in are non-prioritized // peers that we are not interested in are non-prioritized
m_channel_state[upload_channel] = peer_info::bw_limit; m_channel_state[upload_channel] = peer_info::bw_limit;
m_ses.m_upload_rate.request_bandwidth(self() m_ses.m_upload_rate.request_bandwidth(self()
, m_send_buffer.size(), priority , (std::max)(m_send_buffer.size(), m_statistics.upload_rate() * 2
/ (1000 / m_ses.m_settings.tick_interval))
, priority
, bwc1, bwc2, bwc3, bwc4); , bwc1, bwc2, bwc3, bwc4);
#ifdef TORRENT_VERBOSE_LOGGING #ifdef TORRENT_VERBOSE_LOGGING
(*m_logger) << time_now_string() << " *** REQUEST_BANDWIDTH [ " (*m_logger) << time_now_string() << " *** REQUEST_BANDWIDTH [ "
@ -4212,7 +4214,9 @@ namespace libtorrent
TORRENT_ASSERT(m_outstanding_bytes >= 0); TORRENT_ASSERT(m_outstanding_bytes >= 0);
m_channel_state[download_channel] = peer_info::bw_limit; m_channel_state[download_channel] = peer_info::bw_limit;
m_ses.m_download_rate.request_bandwidth(self() m_ses.m_download_rate.request_bandwidth(self()
, (std::max)(m_outstanding_bytes, m_packet_size - m_recv_pos) + 30 , (std::max)((std::max)(m_outstanding_bytes, m_packet_size - m_recv_pos) + 30
, m_statistics.download_rate() * 2
/ (1000 / m_ses.m_settings.tick_interval))
, priority , bwc1, bwc2, bwc3, bwc4); , priority , bwc1, bwc2, bwc3, bwc4);
} }

View File

@ -1326,7 +1326,7 @@ namespace aux {
if (update_disk_io_thread) if (update_disk_io_thread)
update_disk_thread_settings(); update_disk_thread_settings();
if (m_allowed_upload_slots <= m_settings.num_optimistic_unchoke_slots / 2) if (m_settings.num_optimistic_unchoke_slots >= m_allowed_upload_slots / 2)
{ {
if (m_alerts.should_post<performance_alert>()) if (m_alerts.should_post<performance_alert>())
m_alerts.post_alert(performance_alert(torrent_handle() m_alerts.post_alert(performance_alert(torrent_handle()
@ -3697,7 +3697,7 @@ namespace aux {
if (m_max_uploads == limit) return; if (m_max_uploads == limit) return;
m_max_uploads = limit; m_max_uploads = limit;
m_allowed_upload_slots = limit; m_allowed_upload_slots = limit;
if (m_allowed_upload_slots <= m_settings.num_optimistic_unchoke_slots / 2) if (m_settings.num_optimistic_unchoke_slots >= m_allowed_upload_slots / 2)
{ {
if (m_alerts.should_post<performance_alert>()) if (m_alerts.should_post<performance_alert>())
m_alerts.post_alert(performance_alert(torrent_handle() m_alerts.post_alert(performance_alert(torrent_handle()
@ -4063,7 +4063,9 @@ namespace aux {
} }
if (m_settings.num_optimistic_unchoke_slots) if (m_settings.num_optimistic_unchoke_slots)
{
TORRENT_ASSERT(num_optimistic <= m_settings.num_optimistic_unchoke_slots); TORRENT_ASSERT(num_optimistic <= m_settings.num_optimistic_unchoke_slots);
}
if (m_num_unchoked != unchokes) if (m_num_unchoked != unchokes)
{ {