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
* make tracker back-off configurable
* don't restart the swarm after downloading metadata from magnet links
* lower the default tracker retry intervals
* 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_outgoing_utp", &session_settings::enable_outgoing_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")

View File

@ -4299,6 +4299,8 @@ struct session_settings
bool lock_files;
int ssl_listen;
int tracker_backoff;
};
</pre>
<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
won't re-open the listen socket simply by changing this setting.</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 class="section" id="pe-settings">
@ -6248,7 +6258,7 @@ struct peer_disconnected_alert: peer_alert
<div class="section" id="invalid-request-alert">
<h2>invalid_request_alert</h2>
<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>
<pre class="literal-block">
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[] =
{
&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;torrent filen r inte en dictionary&quot;,
&quot;'info'-nyckeln saknas eller r korrupt i torrentfilen&quot;,
&quot;'info'-f‰ltet ‰r inte en dictionary&quot;,
&quot;'piece length' f‰ltet saknas eller ‰r korrupt i torrentfilen&quot;,
&quot;torrentfilen saknar namnfltet&quot;,
&quot;torrent filen är inte en dictionary&quot;,
&quot;'info'-nyckeln saknas eller är korrupt i torrentfilen&quot;,
&quot;'info'-fältet är inte en dictionary&quot;,
&quot;'piece length' fältet saknas eller är korrupt i torrentfilen&quot;,
&quot;torrentfilen saknar namnfältet&quot;,
&quot;ogiltigt namn i torrentfilen (kan vara en attack)&quot;,
// ... more strings here
};

View File

@ -4556,6 +4556,8 @@ session_settings
bool lock_files;
int ssl_listen;
int tracker_backoff;
};
``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.
``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
===========

View File

@ -919,6 +919,14 @@ namespace libtorrent
// open an ssl listen socket for ssl torrents on this port
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

View File

@ -63,6 +63,7 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent
{
class peer_connection;
struct session_settings;
enum
{
@ -144,7 +145,7 @@ namespace libtorrent
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
{

View File

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

View File

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

View File

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

View File

@ -64,6 +64,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/utf8.hpp"
#include "libtorrent/time.hpp"
#include "libtorrent/invariant_check.hpp"
#include "libtorrent/session_settings.hpp"
#if TORRENT_USE_I2P
#include "libtorrent/parse_url.hpp"
@ -470,13 +471,15 @@ namespace libtorrent
int announce_entry::min_announce_in() const
{ 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;
// the exponential back-off ends up being:
// 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)
* 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);
next_announce = time_now() + seconds(delay);
updating = false;

View File

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