when a tracker is force announced or scraped by the user/client, the resulting response or failure alert is now posted regardless of the alert mask. Since it's user initiated, it's reasonable to expect the user to be interested in the response
This commit is contained in:
parent
6fd0c1a3b0
commit
3cd57b59e0
|
@ -1,3 +1,5 @@
|
|||
* tracker response alerts from user initiated announces/scrapes are now
|
||||
posted regardless of alert mask
|
||||
* improve DHT performance when changing external IP (primarily affects
|
||||
bootstrapping).
|
||||
* add feature to stop torrents immediately after checking files is done
|
||||
|
|
|
@ -157,6 +157,9 @@ namespace libtorrent
|
|||
// this is false the stats sent to this tracker will be 0
|
||||
bool send_stats:1;
|
||||
|
||||
// internal
|
||||
bool triggered_manually:1;
|
||||
|
||||
// reset announce counters and clears the started sent flag.
|
||||
// The announce_entry will look like we've never talked to
|
||||
// the tracker.
|
||||
|
|
|
@ -722,7 +722,7 @@ namespace libtorrent
|
|||
|
||||
// forcefully sets next_announce to the current time
|
||||
void force_tracker_request(time_point, int tracker_idx);
|
||||
void scrape_tracker();
|
||||
void scrape_tracker(bool user_triggered);
|
||||
void announce_with_tracker(boost::uint8_t e
|
||||
= tracker_request::none
|
||||
, address const& bind_interface = address_v4::any());
|
||||
|
|
|
@ -99,6 +99,7 @@ namespace libtorrent
|
|||
, key(0)
|
||||
, num_want(0)
|
||||
, send_stats(true)
|
||||
, triggered_manually(false)
|
||||
#ifdef TORRENT_USE_OPENSSL
|
||||
, ssl_ctx(0)
|
||||
#endif
|
||||
|
@ -154,6 +155,11 @@ namespace libtorrent
|
|||
address bind_ip;
|
||||
|
||||
bool send_stats;
|
||||
|
||||
// this is set to true if this request was triggered by a "manual" call to
|
||||
// scrape_tracker() or force_reannounce()
|
||||
bool triggered_manually;
|
||||
|
||||
#ifdef TORRENT_USE_OPENSSL
|
||||
boost::asio::ssl::context* ssl_ctx;
|
||||
#endif
|
||||
|
|
|
@ -62,6 +62,7 @@ namespace libtorrent
|
|||
, start_sent(false)
|
||||
, complete_sent(false)
|
||||
, send_stats(true)
|
||||
, triggered_manually(false)
|
||||
{}
|
||||
|
||||
announce_entry::announce_entry()
|
||||
|
@ -79,6 +80,7 @@ namespace libtorrent
|
|||
, start_sent(false)
|
||||
, complete_sent(false)
|
||||
, send_stats(true)
|
||||
, triggered_manually(false)
|
||||
{}
|
||||
|
||||
announce_entry::~announce_entry() {}
|
||||
|
|
|
@ -3219,7 +3219,9 @@ retry:
|
|||
torrent& t = *want_scrape[m_next_scrape_torrent];
|
||||
TORRENT_ASSERT(t.is_paused() && t.is_auto_managed());
|
||||
|
||||
t.scrape_tracker();
|
||||
// false means it's not triggered by the user, but automatically
|
||||
// by libtorrent
|
||||
t.scrape_tracker(false);
|
||||
|
||||
++m_next_scrape_torrent;
|
||||
if (m_next_scrape_torrent >= int(want_scrape.size()))
|
||||
|
|
|
@ -2887,16 +2887,17 @@ namespace libtorrent
|
|||
#if defined TORRENT_ASIO_DEBUGGING
|
||||
complete_async("tracker::on_tracker_announce_disp");
|
||||
#endif
|
||||
if (e) return;
|
||||
boost::shared_ptr<torrent> t = p.lock();
|
||||
if (!t) return;
|
||||
t->m_waiting_tracker = false;
|
||||
|
||||
if (e) return;
|
||||
t->on_tracker_announce();
|
||||
}
|
||||
|
||||
void torrent::on_tracker_announce()
|
||||
{
|
||||
TORRENT_ASSERT(is_single_thread());
|
||||
m_waiting_tracker = false;
|
||||
if (m_abort) return;
|
||||
announce_with_tracker();
|
||||
}
|
||||
|
@ -3148,8 +3149,6 @@ namespace libtorrent
|
|||
, ae.tier, tier, ae.is_working(), ae.fails, ae.fail_limit
|
||||
, ae.updating, ae.can_announce(now, is_seed()), sent_announce);
|
||||
#endif
|
||||
// if trackerid is not specified for tracker use default one, probably set explicitly
|
||||
req.trackerid = ae.trackerid.empty() ? m_trackerid : ae.trackerid;
|
||||
if (settings().get_bool(settings_pack::announce_to_all_tiers)
|
||||
&& !settings().get_bool(settings_pack::announce_to_all_trackers)
|
||||
&& sent_announce
|
||||
|
@ -3157,6 +3156,9 @@ namespace libtorrent
|
|||
&& tier != INT_MAX)
|
||||
continue;
|
||||
|
||||
// if trackerid is not specified for tracker use default one, probably set explicitly
|
||||
req.trackerid = ae.trackerid.empty() ? m_trackerid : ae.trackerid;
|
||||
|
||||
if (ae.tier > tier && sent_announce
|
||||
&& !settings().get_bool(settings_pack::announce_to_all_tiers)) break;
|
||||
if (ae.is_working()) { tier = ae.tier; sent_announce = false; }
|
||||
|
@ -3175,6 +3177,9 @@ namespace libtorrent
|
|||
else if (!ae.complete_sent && is_seed()) req.event = tracker_request::completed;
|
||||
}
|
||||
|
||||
req.triggered_manually = ae.triggered_manually;
|
||||
ae.triggered_manually = false;
|
||||
|
||||
req.bind_ip = bind_interface;
|
||||
|
||||
if (settings().get_bool(settings_pack::force_proxy))
|
||||
|
@ -3191,7 +3196,8 @@ namespace libtorrent
|
|||
&& proxy_type == settings_pack::none)
|
||||
{
|
||||
ae.next_announce = now + minutes(10);
|
||||
if (m_ses.alerts().should_post<anonymous_mode_alert>())
|
||||
if (m_ses.alerts().should_post<anonymous_mode_alert>()
|
||||
|| req.triggered_manually)
|
||||
{
|
||||
m_ses.alerts().emplace_alert<anonymous_mode_alert>(get_handle()
|
||||
, anonymous_mode_alert::tracker_not_anonymous, req.url);
|
||||
|
@ -3208,7 +3214,8 @@ namespace libtorrent
|
|||
&& proxy_type != settings_pack::i2p_proxy)
|
||||
{
|
||||
ae.next_announce = now + minutes(10);
|
||||
if (m_ses.alerts().should_post<anonymous_mode_alert>())
|
||||
if (m_ses.alerts().should_post<anonymous_mode_alert>()
|
||||
|| req.triggered_manually)
|
||||
{
|
||||
m_ses.alerts().emplace_alert<anonymous_mode_alert>(get_handle()
|
||||
, anonymous_mode_alert::tracker_not_anonymous, req.url);
|
||||
|
@ -3268,7 +3275,7 @@ namespace libtorrent
|
|||
update_tracker_timer(now);
|
||||
}
|
||||
|
||||
void torrent::scrape_tracker()
|
||||
void torrent::scrape_tracker(bool user_triggered)
|
||||
{
|
||||
TORRENT_ASSERT(is_single_thread());
|
||||
m_last_scrape = m_ses.session_time();
|
||||
|
@ -3290,6 +3297,7 @@ namespace libtorrent
|
|||
req.auth = tracker_login();
|
||||
#endif
|
||||
req.key = tracker_key();
|
||||
req.triggered_manually = user_triggered;
|
||||
m_ses.queue_tracker_request(req, shared_from_this());
|
||||
}
|
||||
|
||||
|
@ -3327,7 +3335,11 @@ namespace libtorrent
|
|||
update_scrape_state();
|
||||
}
|
||||
|
||||
if (m_ses.alerts().should_post<scrape_reply_alert>())
|
||||
// if this was triggered manually we need to post this unconditionally,
|
||||
// since the client expects a response from its action, regardless of
|
||||
// whether all tracker events have been enabled by the alert mask
|
||||
if (m_ses.alerts().should_post<scrape_reply_alert>()
|
||||
|| req.triggered_manually)
|
||||
{
|
||||
m_ses.alerts().emplace_alert<scrape_reply_alert>(
|
||||
get_handle(), incomplete, complete, req.url);
|
||||
|
@ -3538,7 +3550,9 @@ namespace libtorrent
|
|||
|
||||
update_want_peers();
|
||||
|
||||
if (m_ses.alerts().should_post<tracker_reply_alert>())
|
||||
// post unconditionally if the announce was triggered manually
|
||||
if (m_ses.alerts().should_post<tracker_reply_alert>()
|
||||
|| r.triggered_manually)
|
||||
{
|
||||
m_ses.alerts().emplace_alert<tracker_reply_alert>(
|
||||
get_handle(), resp.peers.size() + resp.peers4.size()
|
||||
|
@ -3681,6 +3695,9 @@ namespace libtorrent
|
|||
return m_waiting_tracker?m_tracker_timer.expires_at():min_time();
|
||||
}
|
||||
|
||||
// this is the entry point for the client to force a re-announce. It's
|
||||
// considered a client-initiated announce (as opposed to the regular ones,
|
||||
// issued by libtorrent)
|
||||
void torrent::force_tracker_request(time_point t, int tracker_idx)
|
||||
{
|
||||
if (is_paused()) return;
|
||||
|
@ -3688,7 +3705,10 @@ namespace libtorrent
|
|||
{
|
||||
for (std::vector<announce_entry>::iterator i = m_trackers.begin()
|
||||
, end(m_trackers.end()); i != end; ++i)
|
||||
{
|
||||
i->next_announce = (std::max)(t, i->min_announce) + seconds(1);
|
||||
i->triggered_manually = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3697,6 +3717,7 @@ namespace libtorrent
|
|||
return;
|
||||
announce_entry& e = m_trackers[tracker_idx];
|
||||
e.next_announce = (std::max)(t, e.min_announce) + seconds(1);
|
||||
e.triggered_manually = true;
|
||||
}
|
||||
update_tracker_timer(clock_type::now());
|
||||
}
|
||||
|
@ -12139,6 +12160,7 @@ namespace libtorrent
|
|||
#endif
|
||||
if (0 == (r.kind & tracker_request::scrape_request))
|
||||
{
|
||||
// announce request
|
||||
announce_entry* ae = find_tracker(r);
|
||||
if (ae)
|
||||
{
|
||||
|
@ -12154,14 +12176,16 @@ namespace libtorrent
|
|||
|
||||
deprioritize_tracker(tracker_index);
|
||||
}
|
||||
if (m_ses.alerts().should_post<tracker_error_alert>())
|
||||
if (m_ses.alerts().should_post<tracker_error_alert>()
|
||||
|| r.triggered_manually)
|
||||
{
|
||||
m_ses.alerts().emplace_alert<tracker_error_alert>(get_handle()
|
||||
, ae?ae->fails:0, response_code, r.url, ec, msg);
|
||||
}
|
||||
}
|
||||
else if (0 != (r.kind & tracker_request::scrape_request))
|
||||
else
|
||||
{
|
||||
// scrape request
|
||||
if (response_code == 410)
|
||||
{
|
||||
// never talk to this tracker again
|
||||
|
@ -12169,7 +12193,11 @@ namespace libtorrent
|
|||
if (ae) ae->fail_limit = 1;
|
||||
}
|
||||
|
||||
if (m_ses.alerts().should_post<scrape_failed_alert>())
|
||||
// if this was triggered manually we need to post this unconditionally,
|
||||
// since the client expects a response from its action, regardless of
|
||||
// whether all tracker events have been enabled by the alert mask
|
||||
if (m_ses.alerts().should_post<scrape_failed_alert>()
|
||||
|| r.triggered_manually)
|
||||
{
|
||||
m_ses.alerts().emplace_alert<scrape_failed_alert>(get_handle(), r.url, ec);
|
||||
}
|
||||
|
|
|
@ -802,7 +802,7 @@ namespace libtorrent
|
|||
|
||||
void torrent_handle::scrape_tracker() const
|
||||
{
|
||||
TORRENT_ASYNC_CALL(scrape_tracker);
|
||||
TORRENT_ASYNC_CALL1(scrape_tracker, true);
|
||||
}
|
||||
|
||||
void torrent_handle::super_seeding(bool on) const
|
||||
|
|
Loading…
Reference in New Issue