From 4d60adcaa984eee184148ba57a1d0fed68618b87 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sat, 24 Mar 2012 15:15:36 +0000 Subject: [PATCH] retry failed trackers a little bit sooner. make the exponential back-off not quite grow as fast --- ChangeLog | 1 + include/libtorrent/torrent_info.hpp | 4 ++-- src/http_tracker_connection.cpp | 8 ++++++-- src/torrent_info.cpp | 4 +++- test/test_primitives.cpp | 14 ++++++++++++++ 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index d6e2a090a..6c8890d55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ + * lower the default tracker retry intervals * support banning web seeds sending corrupt data * don't let hung outgoing connection attempts block incoming connections * improve SSL torrent support by using SNI and a single SSL listen socket diff --git a/include/libtorrent/torrent_info.hpp b/include/libtorrent/torrent_info.hpp index 1876f3654..3faa117b5 100644 --- a/include/libtorrent/torrent_info.hpp +++ b/include/libtorrent/torrent_info.hpp @@ -66,8 +66,8 @@ namespace libtorrent enum { - // wait 60 seconds before retrying a failed tracker - tracker_retry_delay_min = 10 + // wait at least 5 seconds before retrying a failed tracker + tracker_retry_delay_min = 5 // when tracker_failed_max trackers // has failed, wait 60 minutes instead , tracker_retry_delay_max = 60 * 60 diff --git a/src/http_tracker_connection.cpp b/src/http_tracker_connection.cpp index c5b4b1ff4..c92a22cd9 100644 --- a/src/http_tracker_connection.cpp +++ b/src/http_tracker_connection.cpp @@ -386,8 +386,8 @@ namespace libtorrent boost::shared_ptr cb = requester(); if (!cb) return; - int interval = int(e.dict_find_int_value("interval", 1800)); - int min_interval = int(e.dict_find_int_value("min interval", 60)); + int interval = int(e.dict_find_int_value("interval", 0)); + int min_interval = int(e.dict_find_int_value("min interval", 30)); std::string trackerid; lazy_entry const* tracker_id = e.dict_find_string("tracker id"); @@ -427,6 +427,10 @@ namespace libtorrent , interval, min_interval); 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 incomplete = int(scrape_data->dict_find_int_value("incomplete", -1)); int downloaded = int(scrape_data->dict_find_int_value("downloaded", -1)); diff --git a/src/torrent_info.cpp b/src/torrent_info.cpp index fb31b0c24..e549dd865 100644 --- a/src/torrent_info.cpp +++ b/src/torrent_info.cpp @@ -473,8 +473,10 @@ namespace libtorrent void announce_entry::failed(int retry_interval) { ++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) - * 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); next_announce = time_now() + seconds(delay); updating = false; diff --git a/test/test_primitives.cpp b/test/test_primitives.cpp index 3ec3cafc2..8dc4dde5e 100644 --- a/test/test_primitives.cpp +++ b/test/test_primitives.cpp @@ -396,6 +396,20 @@ int test_main() error_code ec; 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 // test sign_rsa and verify_rsa char private_key[1192];