diff --git a/Jamfile b/Jamfile index d93bc3534..e0f8bc2bc 100755 --- a/Jamfile +++ b/Jamfile @@ -103,7 +103,7 @@ lib torrent : multi static - debug:TORRENT_VERBOSE_LOGGING +# debug:TORRENT_VERBOSE_LOGGING : debug release ; diff --git a/examples/client_test.cpp b/examples/client_test.cpp index e5cde9347..ac95c44b9 100755 --- a/examples/client_test.cpp +++ b/examples/client_test.cpp @@ -244,7 +244,8 @@ int main(int argc, char* argv[]) session ses(fingerprint("LT", 0, 1, 0, 0)); ses.listen_on(std::make_pair(6881, 6889)); - ses.set_upload_rate_limit(100000); +// ses.set_upload_rate_limit(100000); +// ses.set_download_rate_limit(50000); ses.set_http_settings(settings); // ses.set_severity_level(alert::debug); ses.set_severity_level(alert::info); diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index af82dd9bd..94bfd671f 100755 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -353,6 +353,9 @@ namespace libtorrent // this is an index into m_torrent_file.trackers() int m_last_working_tracker; int m_currently_trying_tracker; + // the number of connection attempts that has + // failed in a row + int m_failed_trackers; // this is a counter that is increased every // second, and when it reaches 10, the policy::pulse() diff --git a/src/file.cpp b/src/file.cpp index a846d5224..3551057dd 100755 --- a/src/file.cpp +++ b/src/file.cpp @@ -161,7 +161,7 @@ namespace libtorrent if (ret == -1) { std::stringstream msg; - msg << "seek failed: " << strerror(errno); + msg << "seek failed: '" << strerror(errno) << "' fd: " << m_fd << " offset: " << offset << " seekdir: " << seekdir; throw file_error(msg.str()); } diff --git a/src/torrent.cpp b/src/torrent.cpp index a06ab27f2..8f4be42ea 100755 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -79,7 +79,11 @@ namespace enum { // wait 60 seconds before retrying a failed tracker - tracker_retry_delay = 60 + tracker_retry_delay_min = 60 + // when tracker_failed_max trackers + // has failed, wait 10 minutes instead + , tracker_retry_delay_max = 10 * 60 + , tracker_failed_max = 5 }; int calculate_block_size(const torrent_info& i) @@ -159,6 +163,7 @@ namespace libtorrent static_cast((torrent_file.total_size()+m_block_size-1)/m_block_size)) , m_last_working_tracker(-1) , m_currently_trying_tracker(0) + , m_failed_trackers(0) , m_time_scaler(0) , m_priority(.5) , m_num_pieces(0) @@ -187,6 +192,7 @@ namespace libtorrent std::vector& peer_list , int interval) { + m_failed_trackers = 0; // less than 60 seconds announce intervals // are insane. if (interval < 60) interval = 60; @@ -417,7 +423,7 @@ namespace libtorrent m_duration = 1800; m_next_request = boost::posix_time::second_clock::local_time() - + boost::posix_time::seconds(tracker_retry_delay); + + boost::posix_time::seconds(tracker_retry_delay_max); tracker_request req; req.info_hash = m_torrent_file.info_hash(); @@ -537,7 +543,7 @@ namespace libtorrent { alerts().post_alert(torrent_finished_alert( get_handle() - , "torrent is finished downloading")); + , "torrent has finished downloading")); } @@ -560,13 +566,19 @@ namespace libtorrent void torrent::try_next_tracker() { - m_currently_trying_tracker++; + ++m_currently_trying_tracker; if ((unsigned)m_currently_trying_tracker >= m_torrent_file.trackers().size()) { + int delay = tracker_retry_delay_min + + std::min(m_failed_trackers, (int)tracker_failed_max) + * (tracker_retry_delay_max - tracker_retry_delay_min) + / tracker_failed_max; + + ++m_failed_trackers; // if we've looped the tracker list, wait a bit before retrying m_currently_trying_tracker = 0; - m_next_request = boost::posix_time::second_clock::local_time() + boost::posix_time::seconds(tracker_retry_delay); + m_next_request = boost::posix_time::second_clock::local_time() + boost::posix_time::seconds(delay); } else { @@ -804,11 +816,6 @@ namespace libtorrent << "\" timed out"; m_ses.m_alerts.post_alert(tracker_alert(get_handle(), s.str())); } - // TODO: increase the retry_delay for - // each failed attempt on the same tracker! - // maybe we should add a counter that keeps - // track of how many times a specific tracker - // has timed out? try_next_tracker(); }