retry failed trackers a little bit sooner. make the exponential back-off not quite grow as fast

This commit is contained in:
Arvid Norberg 2012-03-24 15:15:36 +00:00
parent 6fcc469aef
commit 4d60adcaa9
5 changed files with 26 additions and 5 deletions

View File

@ -1,3 +1,4 @@
* lower the default tracker retry intervals
* support banning web seeds sending corrupt data * support banning web seeds sending corrupt data
* don't let hung outgoing connection attempts block incoming connections * don't let hung outgoing connection attempts block incoming connections
* improve SSL torrent support by using SNI and a single SSL listen socket * improve SSL torrent support by using SNI and a single SSL listen socket

View File

@ -66,8 +66,8 @@ namespace libtorrent
enum enum
{ {
// wait 60 seconds before retrying a failed tracker // wait at least 5 seconds before retrying a failed tracker
tracker_retry_delay_min = 10 tracker_retry_delay_min = 5
// when tracker_failed_max trackers // when tracker_failed_max trackers
// has failed, wait 60 minutes instead // has failed, wait 60 minutes instead
, tracker_retry_delay_max = 60 * 60 , tracker_retry_delay_max = 60 * 60

View File

@ -386,8 +386,8 @@ namespace libtorrent
boost::shared_ptr<request_callback> cb = requester(); boost::shared_ptr<request_callback> cb = requester();
if (!cb) return; if (!cb) return;
int interval = int(e.dict_find_int_value("interval", 1800)); int interval = int(e.dict_find_int_value("interval", 0));
int min_interval = int(e.dict_find_int_value("min interval", 60)); int min_interval = int(e.dict_find_int_value("min interval", 30));
std::string trackerid; std::string trackerid;
lazy_entry const* tracker_id = e.dict_find_string("tracker id"); lazy_entry const* tracker_id = e.dict_find_string("tracker id");
@ -427,6 +427,10 @@ namespace libtorrent
, interval, min_interval); , interval, min_interval);
return; return;
} }
// if no interval is specified, default to 30 minutes
if (interval == 0) interval == 1800;
int complete = int(scrape_data->dict_find_int_value("complete", -1)); int complete = int(scrape_data->dict_find_int_value("complete", -1));
int incomplete = int(scrape_data->dict_find_int_value("incomplete", -1)); int incomplete = int(scrape_data->dict_find_int_value("incomplete", -1));
int downloaded = int(scrape_data->dict_find_int_value("downloaded", -1)); int downloaded = int(scrape_data->dict_find_int_value("downloaded", -1));

View File

@ -473,8 +473,10 @@ namespace libtorrent
void announce_entry::failed(int retry_interval) void announce_entry::failed(int retry_interval)
{ {
++fails; ++fails;
// the exponential back-off ends up being:
// 7, 15, 27, 45, 95, 127, 165, ... seconds
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, int(tracker_retry_delay_max)); * tracker_retry_delay_min / 2, 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

@ -396,6 +396,20 @@ int test_main()
error_code ec; error_code ec;
int ret = 0; int ret = 0;
// make sure the retry interval keeps growing
// on failing announces
announce_entry ae("dummy");
int last = 0;
for (int i = 0; i < 10; ++i)
{
ae.failed(5);
int delay = ae.next_announce_in();
TEST_CHECK(delay > last);
last = delay;
fprintf(stderr, "%d, ", delay);
}
fprintf(stderr, "\n");
#if defined TORRENT_USE_OPENSSL #if defined TORRENT_USE_OPENSSL
// test sign_rsa and verify_rsa // test sign_rsa and verify_rsa
char private_key[1192]; char private_key[1192];