fixed support for min-interval on tracker failures
This commit is contained in:
parent
cf01c181ae
commit
0fc90b5655
|
@ -83,6 +83,7 @@
|
||||||
* added torrent_info::remap_files()
|
* added torrent_info::remap_files()
|
||||||
* support min_interval tracker extension
|
* support min_interval tracker extension
|
||||||
* added session saving and loading functions
|
* added session saving and loading functions
|
||||||
|
* added support for min-interval in tracker responses
|
||||||
|
|
||||||
release 0.14.8
|
release 0.14.8
|
||||||
|
|
||||||
|
|
|
@ -393,7 +393,7 @@ namespace libtorrent
|
||||||
virtual void tracker_request_timed_out(
|
virtual void tracker_request_timed_out(
|
||||||
tracker_request const& r);
|
tracker_request const& r);
|
||||||
virtual void tracker_request_error(tracker_request const& r
|
virtual void tracker_request_error(tracker_request const& r
|
||||||
, int response_code, const std::string& str);
|
, int response_code, const std::string& str, int retry_interval);
|
||||||
virtual void tracker_warning(tracker_request const& req
|
virtual void tracker_warning(tracker_request const& req
|
||||||
, std::string const& msg);
|
, std::string const& msg);
|
||||||
virtual void tracker_scrape_response(tracker_request const& req
|
virtual void tracker_scrape_response(tracker_request const& req
|
||||||
|
|
|
@ -140,7 +140,7 @@ namespace libtorrent
|
||||||
min_announce = min_time();
|
min_announce = min_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
void failed();
|
void failed(int retry_interval = 0);
|
||||||
|
|
||||||
bool can_announce(ptime now) const
|
bool can_announce(ptime now) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -138,7 +138,8 @@ namespace libtorrent
|
||||||
virtual void tracker_request_error(
|
virtual void tracker_request_error(
|
||||||
tracker_request const& req
|
tracker_request const& req
|
||||||
, int response_code
|
, int response_code
|
||||||
, const std::string& description) = 0;
|
, const std::string& description
|
||||||
|
, int retry_interval) = 0;
|
||||||
|
|
||||||
tcp::endpoint m_tracker_address;
|
tcp::endpoint m_tracker_address;
|
||||||
|
|
||||||
|
@ -199,7 +200,7 @@ namespace libtorrent
|
||||||
tracker_request const& tracker_req() const { return m_req; }
|
tracker_request const& tracker_req() const { return m_req; }
|
||||||
|
|
||||||
void fail_disp(int code, std::string const& msg) { fail(code, msg.c_str()); }
|
void fail_disp(int code, std::string const& msg) { fail(code, msg.c_str()); }
|
||||||
void fail(int code, char const* msg);
|
void fail(int code, char const* msg, int interval = 0, int min_interval = 0);
|
||||||
void fail_timeout();
|
void fail_timeout();
|
||||||
virtual void start() = 0;
|
virtual void start() = 0;
|
||||||
virtual void close();
|
virtual void close();
|
||||||
|
|
|
@ -361,11 +361,14 @@ namespace libtorrent
|
||||||
boost::shared_ptr<request_callback> cb = requester();
|
boost::shared_ptr<request_callback> cb = requester();
|
||||||
if (!cb) return;
|
if (!cb) return;
|
||||||
|
|
||||||
|
int interval = e.dict_find_int_value("interval", 1800);
|
||||||
|
int min_interval = e.dict_find_int_value("min interval", 60);
|
||||||
|
|
||||||
// parse the response
|
// parse the response
|
||||||
lazy_entry const* failure = e.dict_find_string("failure reason");
|
lazy_entry const* failure = e.dict_find_string("failure reason");
|
||||||
if (failure)
|
if (failure)
|
||||||
{
|
{
|
||||||
fail(status_code, failure->string_value().c_str());
|
fail(status_code, failure->string_value().c_str(), interval, min_interval);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,14 +385,16 @@ namespace libtorrent
|
||||||
lazy_entry const* files = e.dict_find_dict("files");
|
lazy_entry const* files = e.dict_find_dict("files");
|
||||||
if (files == 0)
|
if (files == 0)
|
||||||
{
|
{
|
||||||
fail(-1, "invalid or missing 'files' entry in scrape response");
|
fail(-1, "invalid or missing 'files' entry in scrape response"
|
||||||
|
, interval, min_interval);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy_entry const* scrape_data = files->dict_find_dict(ih.c_str());
|
lazy_entry const* scrape_data = files->dict_find_dict(ih.c_str());
|
||||||
if (scrape_data == 0)
|
if (scrape_data == 0)
|
||||||
{
|
{
|
||||||
fail(-1, "missing or invalid info-hash entry in scrape response");
|
fail(-1, "missing or invalid info-hash entry in scrape response"
|
||||||
|
, interval, min_interval);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int complete = scrape_data->dict_find_int_value("complete", -1);
|
int complete = scrape_data->dict_find_int_value("complete", -1);
|
||||||
|
@ -400,9 +405,6 @@ namespace libtorrent
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int interval = e.dict_find_int_value("interval", 1800);
|
|
||||||
int min_interval = e.dict_find_int_value("min interval", 60);
|
|
||||||
|
|
||||||
lazy_entry const* peers_ent = e.dict_find("peers");
|
lazy_entry const* peers_ent = e.dict_find("peers");
|
||||||
if (peers_ent && peers_ent->type() == lazy_entry::string_t)
|
if (peers_ent && peers_ent->type() == lazy_entry::string_t)
|
||||||
{
|
{
|
||||||
|
@ -465,7 +467,8 @@ namespace libtorrent
|
||||||
|
|
||||||
if (peers_ent == 0 && ipv6_peers == 0)
|
if (peers_ent == 0 && ipv6_peers == 0)
|
||||||
{
|
{
|
||||||
fail(-1, "missing 'peers' and 'peers6' entry in tracker response");
|
fail(-1, "missing 'peers' and 'peers6' entry in tracker response"
|
||||||
|
, interval, min_interval);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6069,7 +6069,8 @@ namespace libtorrent
|
||||||
// the tracker as a failure and not retry
|
// the tracker as a failure and not retry
|
||||||
// it anymore
|
// it anymore
|
||||||
void torrent::tracker_request_error(tracker_request const& r
|
void torrent::tracker_request_error(tracker_request const& r
|
||||||
, int response_code, const std::string& str)
|
, int response_code, const std::string& str
|
||||||
|
, int retry_interval)
|
||||||
{
|
{
|
||||||
mutex::scoped_lock l(m_ses.m_mutex);
|
mutex::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
|
@ -6083,7 +6084,7 @@ namespace libtorrent
|
||||||
announce_entry* ae = find_tracker(r);
|
announce_entry* ae = find_tracker(r);
|
||||||
if (ae)
|
if (ae)
|
||||||
{
|
{
|
||||||
ae->failed();
|
ae->failed(retry_interval);
|
||||||
int tracker_index = ae - &m_trackers[0];
|
int tracker_index = ae - &m_trackers[0];
|
||||||
deprioritize_tracker(tracker_index);
|
deprioritize_tracker(tracker_index);
|
||||||
}
|
}
|
||||||
|
|
|
@ -406,11 +406,12 @@ namespace libtorrent
|
||||||
int announce_entry::min_announce_in() const
|
int announce_entry::min_announce_in() const
|
||||||
{ return total_seconds(time_now() - min_announce); }
|
{ return total_seconds(time_now() - min_announce); }
|
||||||
|
|
||||||
void announce_entry::failed()
|
void announce_entry::failed(int retry_interval)
|
||||||
{
|
{
|
||||||
++fails;
|
++fails;
|
||||||
int delay = (std::min)(tracker_retry_delay_min + int(fails) * int(fails) * tracker_retry_delay_min
|
int delay = (std::min)(tracker_retry_delay_min + int(fails) * int(fails)
|
||||||
, int(tracker_retry_delay_max));
|
* tracker_retry_delay_min, int(tracker_retry_delay_max));
|
||||||
|
delay = (std::max)(delay, retry_interval);
|
||||||
next_announce = time_now() + seconds(delay);
|
next_announce = time_now() + seconds(delay);
|
||||||
updating = false;
|
updating = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,10 +140,11 @@ namespace libtorrent
|
||||||
return m_requester.lock();
|
return m_requester.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void tracker_connection::fail(int code, char const* msg)
|
void tracker_connection::fail(int code, char const* msg, int interval, int min_interval)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<request_callback> cb = requester();
|
boost::shared_ptr<request_callback> cb = requester();
|
||||||
if (cb) cb->tracker_request_error(m_req, code, msg);
|
if (cb) cb->tracker_request_error(m_req, code, msg
|
||||||
|
, interval == 0 ? min_interval : interval);
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,7 +247,7 @@ namespace libtorrent
|
||||||
// we need to post the error to avoid deadlock
|
// we need to post the error to avoid deadlock
|
||||||
if (boost::shared_ptr<request_callback> r = c.lock())
|
if (boost::shared_ptr<request_callback> r = c.lock())
|
||||||
ios.post(boost::bind(&request_callback::tracker_request_error, r, req, -1
|
ios.post(boost::bind(&request_callback::tracker_request_error, r, req, -1
|
||||||
, "unknown protocol in tracker url: " + req.url));
|
, "unknown protocol in tracker url: " + req.url, 0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue