make tracker back-off configurable

This commit is contained in:
Arvid Norberg 2012-03-29 03:51:22 +00:00
parent 4ef441f9ca
commit 418c1e8190
11 changed files with 55 additions and 12 deletions

View File

@ -1,6 +1,7 @@
0.16 release 0.16 release
* make tracker back-off configurable
* don't restart the swarm after downloading metadata from magnet links * don't restart the swarm after downloading metadata from magnet links
* lower the default tracker retry intervals * lower the default tracker retry intervals
* support banning web seeds sending corrupt data * support banning web seeds sending corrupt data

View File

@ -170,6 +170,8 @@ void bind_session_settings()
.def_readwrite("enable_incoming_tcp", &session_settings::enable_incoming_tcp) .def_readwrite("enable_incoming_tcp", &session_settings::enable_incoming_tcp)
.def_readwrite("enable_outgoing_utp", &session_settings::enable_outgoing_utp) .def_readwrite("enable_outgoing_utp", &session_settings::enable_outgoing_utp)
.def_readwrite("enable_incoming_utp", &session_settings::enable_incoming_utp) .def_readwrite("enable_incoming_utp", &session_settings::enable_incoming_utp)
.def_readwrite("ssl_listen", &session_settings::ssl_listen)
.def_readwrite("tracker_backoff", &session_settings::tracker_backoff)
; ;
enum_<proxy_settings::proxy_type>("proxy_type") enum_<proxy_settings::proxy_type>("proxy_type")

View File

@ -4299,6 +4299,8 @@ struct session_settings
bool lock_files; bool lock_files;
int ssl_listen; int ssl_listen;
int tracker_backoff;
}; };
</pre> </pre>
<p><tt class="docutils literal"><span class="pre">version</span></tt> is automatically set to the libtorrent version you're using <p><tt class="docutils literal"><span class="pre">version</span></tt> is automatically set to the libtorrent version you're using
@ -5037,6 +5039,14 @@ no SSL listen port is opened. Otherwise a socket is opened on this port. This
setting is only taken into account when opening the regular listen port, and setting is only taken into account when opening the regular listen port, and
won't re-open the listen socket simply by changing this setting.</p> won't re-open the listen socket simply by changing this setting.</p>
<p>It defaults to port 4433.</p> <p>It defaults to port 4433.</p>
<p><tt class="docutils literal"><span class="pre">tracker_backoff</span></tt> determines how aggressively to back off from retrying
failing trackers. This value determines <em>x</em> in the following formula, determining
the number of seconds to wait until the next retry:</p>
<blockquote>
delay = 5 + 5 * x / 100 * fails^2</blockquote>
<p>It defaults to 250.</p>
<p>This setting may be useful to make libtorrent more or less aggressive in hitting
trackers.</p>
</div> </div>
</div> </div>
<div class="section" id="pe-settings"> <div class="section" id="pe-settings">
@ -6248,7 +6258,7 @@ struct peer_disconnected_alert: peer_alert
<div class="section" id="invalid-request-alert"> <div class="section" id="invalid-request-alert">
<h2>invalid_request_alert</h2> <h2>invalid_request_alert</h2>
<p>This is a debug alert that is generated by an incoming invalid piece request. <p>This is a debug alert that is generated by an incoming invalid piece request.
<tt class="docutils literal"><span class="pre">Ïp</span></tt> is the address of the peer and the <tt class="docutils literal"><span class="pre">request</span></tt> is the actual incoming <tt class="docutils literal"><span class="pre">ìp</span></tt> is the address of the peer and the <tt class="docutils literal"><span class="pre">request</span></tt> is the actual incoming
request from the peer.</p> request from the peer.</p>
<pre class="literal-block"> <pre class="literal-block">
struct invalid_request_alert: peer_alert struct invalid_request_alert: peer_alert
@ -7835,13 +7845,13 @@ std::string error_code_to_string(boost::system::error_code const&amp; ec)
static const char const* swedish[] = static const char const* swedish[] =
{ {
&quot;inget fel&quot;, &quot;inget fel&quot;,
&quot;en fil i torrenten kolliderar med en fil frÂn en annan torrent&quot;, &quot;en fil i torrenten kolliderar med en fil från en annan torrent&quot;,
&quot;hash check misslyckades&quot;, &quot;hash check misslyckades&quot;,
&quot;torrent filen r inte en dictionary&quot;, &quot;torrent filen är inte en dictionary&quot;,
&quot;'info'-nyckeln saknas eller r korrupt i torrentfilen&quot;, &quot;'info'-nyckeln saknas eller är korrupt i torrentfilen&quot;,
&quot;'info'-f‰ltet ‰r inte en dictionary&quot;, &quot;'info'-fältet är inte en dictionary&quot;,
&quot;'piece length' f‰ltet saknas eller ‰r korrupt i torrentfilen&quot;, &quot;'piece length' fältet saknas eller är korrupt i torrentfilen&quot;,
&quot;torrentfilen saknar namnfltet&quot;, &quot;torrentfilen saknar namnfältet&quot;,
&quot;ogiltigt namn i torrentfilen (kan vara en attack)&quot;, &quot;ogiltigt namn i torrentfilen (kan vara en attack)&quot;,
// ... more strings here // ... more strings here
}; };

View File

@ -4556,6 +4556,8 @@ session_settings
bool lock_files; bool lock_files;
int ssl_listen; int ssl_listen;
int tracker_backoff;
}; };
``version`` is automatically set to the libtorrent version you're using ``version`` is automatically set to the libtorrent version you're using
@ -5442,6 +5444,17 @@ won't re-open the listen socket simply by changing this setting.
It defaults to port 4433. It defaults to port 4433.
``tracker_backoff`` determines how aggressively to back off from retrying
failing trackers. This value determines *x* in the following formula, determining
the number of seconds to wait until the next retry:
delay = 5 + 5 * x / 100 * fails^2
It defaults to 250.
This setting may be useful to make libtorrent more or less aggressive in hitting
trackers.
pe_settings pe_settings
=========== ===========

View File

@ -919,6 +919,14 @@ namespace libtorrent
// open an ssl listen socket for ssl torrents on this port // open an ssl listen socket for ssl torrents on this port
int ssl_listen; int ssl_listen;
// this is the factor X in the formula to calculate the
// next tracker timeout:
// delay = 5 + X/100 * fails^2
// so, it's an exponential back-off, and this factor
// determines how fast the back-off happens. Default
// is 250
int tracker_backoff;
}; };
#ifndef TORRENT_DISABLE_DHT #ifndef TORRENT_DISABLE_DHT

View File

@ -63,6 +63,7 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent namespace libtorrent
{ {
class peer_connection; class peer_connection;
struct session_settings;
enum enum
{ {
@ -144,7 +145,7 @@ namespace libtorrent
min_announce = min_time(); min_announce = min_time();
} }
void failed(int retry_interval = 0); void failed(session_settings const& sett, int retry_interval = 0);
bool will_announce(ptime now) const bool will_announce(ptime now) const
{ {

View File

@ -1276,6 +1276,7 @@ namespace libtorrent
, use_disk_read_ahead(true) , use_disk_read_ahead(true)
, lock_files(false) , lock_files(false)
, ssl_listen(4433) , ssl_listen(4433)
, tracker_backoff(250)
{} {}
session_settings::~session_settings() {} session_settings::~session_settings() {}

View File

@ -441,6 +441,8 @@ namespace aux {
TORRENT_SETTING(integer, read_job_every) TORRENT_SETTING(integer, read_job_every)
TORRENT_SETTING(boolean, use_disk_read_ahead) TORRENT_SETTING(boolean, use_disk_read_ahead)
TORRENT_SETTING(boolean, lock_files) TORRENT_SETTING(boolean, lock_files)
TORRENT_SETTING(integer, ssl_listen)
TORRENT_SETTING(integer, tracker_backoff)
}; };
#undef TORRENT_SETTING #undef TORRENT_SETTING

View File

@ -8454,7 +8454,7 @@ namespace libtorrent
announce_entry* ae = find_tracker(r); announce_entry* ae = find_tracker(r);
if (ae) if (ae)
{ {
ae->failed(retry_interval); ae->failed(settings(), retry_interval);
ae->last_error = ec; ae->last_error = ec;
ae->message = msg; ae->message = msg;
int tracker_index = ae - &m_trackers[0]; int tracker_index = ae - &m_trackers[0];

View File

@ -64,6 +64,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/utf8.hpp" #include "libtorrent/utf8.hpp"
#include "libtorrent/time.hpp" #include "libtorrent/time.hpp"
#include "libtorrent/invariant_check.hpp" #include "libtorrent/invariant_check.hpp"
#include "libtorrent/session_settings.hpp"
#if TORRENT_USE_I2P #if TORRENT_USE_I2P
#include "libtorrent/parse_url.hpp" #include "libtorrent/parse_url.hpp"
@ -470,13 +471,15 @@ namespace libtorrent
int announce_entry::min_announce_in() const int announce_entry::min_announce_in() const
{ return total_seconds(min_announce - time_now()); } { return total_seconds(min_announce - time_now()); }
void announce_entry::failed(int retry_interval) void announce_entry::failed(session_settings const& sett, int retry_interval)
{ {
++fails; ++fails;
// the exponential back-off ends up being: // the exponential back-off ends up being:
// 7, 15, 27, 45, 95, 127, 165, ... seconds // 7, 15, 27, 45, 95, 127, 165, ... seconds
// with the default tracker_backoff of 250
int delay = (std::min)(tracker_retry_delay_min + int(fails) * int(fails) int delay = (std::min)(tracker_retry_delay_min + int(fails) * int(fails)
* tracker_retry_delay_min / 2, int(tracker_retry_delay_max)); * tracker_retry_delay_min * sett.tracker_backoff / 100
, int(tracker_retry_delay_max));
delay = (std::max)(delay, retry_interval); delay = (std::max)(delay, retry_interval);
next_announce = time_now() + seconds(delay); next_announce = time_now() + seconds(delay);
updating = false; updating = false;

View File

@ -400,9 +400,11 @@ int test_main()
// on failing announces // on failing announces
announce_entry ae("dummy"); announce_entry ae("dummy");
int last = 0; int last = 0;
session_settings sett;
sett.tracker_backoff = 250;
for (int i = 0; i < 10; ++i) for (int i = 0; i < 10; ++i)
{ {
ae.failed(5); ae.failed(sett, 5);
int delay = ae.next_announce_in(); int delay = ae.next_announce_in();
TEST_CHECK(delay > last); TEST_CHECK(delay > last);
last = delay; last = delay;