use 32 bit time points in torrent (#1662)

use 32 bit time points in torrent and add some slack to time point comparisons in python test
This commit is contained in:
Arvid Norberg 2017-02-05 19:18:06 -05:00 committed by GitHub
parent bfe6aba728
commit 9e4045ed42
20 changed files with 152 additions and 134 deletions

View File

@ -60,7 +60,7 @@ struct time_duration_to_python
struct time_point_to_python
{
static PyObject* convert(lt::time_point pt)
static PyObject* convert(lt::time_point const pt)
{
using std::chrono::system_clock;
using std::chrono::duration_cast;

View File

@ -90,8 +90,8 @@ class test_torrent_handle(unittest.TestCase):
self.setup()
st = self.h.status()
# last upload and download times are at session start time
self.assertEqual(st.last_upload, sessionStart)
self.assertEqual(st.last_download, sessionStart)
self.assertLessEqual(abs(st.last_upload - sessionStart), datetime.timedelta(seconds=1))
self.assertLessEqual(abs(st.last_download - sessionStart), datetime.timedelta(seconds=1))
def test_torrent_status(self):
self.setup()

View File

@ -83,10 +83,10 @@ namespace libtorrent
#endif
// the time of next tracker announce
time_point next_announce = min_time();
time_point32 next_announce = time_point32::min();
// no announces before this time
time_point min_announce = min_time();
time_point32 min_announce = time_point32::min();
// TODO: include the number of peers received from this tracker, at last
// announce
@ -168,7 +168,7 @@ namespace libtorrent
// updates the failure counter and time-outs for re-trying.
// This is called when the tracker announce fails.
void failed(time_duration tracker_backoff, int retry_interval = 0);
void failed(int backoff_ratio, seconds32 retry_interval = seconds32(0));
#ifndef TORRENT_NO_DEPRECATE
// deprecated in 1.0

View File

@ -1247,16 +1247,16 @@ namespace libtorrent
{
explicit tracker_logger(session_interface& ses);
void tracker_warning(tracker_request const& req
, std::string const& str);
, std::string const& str) override;
void tracker_response(tracker_request const&
, libtorrent::address const& tracker_ip
, std::list<address> const& ip_list
, struct tracker_response const& resp);
, struct tracker_response const& resp) override;
void tracker_request_error(tracker_request const& r
, int response_code, error_code const& ec, const std::string& str
, int retry_interval);
bool should_log() const;
void debug_log(const char* fmt, ...) const TORRENT_FORMAT(2,3);
, seconds32 retry_interval) override;
bool should_log() const override;
void debug_log(const char* fmt, ...) const override TORRENT_FORMAT(2,3);
session_interface& m_ses;
private:
// explicitly disallow assignment, to silence msvc warning

View File

@ -41,6 +41,7 @@ namespace libtorrent { namespace aux
// returns the current time, as represented by time_point. The
// resolution of this timer is about 100 ms.
TORRENT_EXTRA_EXPORT time_point time_now();
TORRENT_EXTRA_EXPORT time_point32 time_now32();
TORRENT_EXTRA_EXPORT void update_time_now();

View File

@ -53,12 +53,18 @@ namespace libtorrent {
using time_point = clock_type::time_point;
using time_duration = clock_type::duration;
// 32 bit versions of time_point and duration, with second resolution
using seconds32 = std::chrono::duration<std::int32_t>;
using minutes32 = std::chrono::duration<std::int32_t, std::ratio<60>>;
using time_point32 = std::chrono::time_point<clock_type, seconds32>;
using std::chrono::seconds;
using std::chrono::milliseconds;
using std::chrono::microseconds;
using std::chrono::minutes;
using std::chrono::hours;
using std::chrono::duration_cast;
using std::chrono::time_point_cast;
// internal
inline time_point min_time() { return (time_point::min)(); }

View File

@ -95,8 +95,6 @@ namespace libtorrent
class bt_peer_connection;
struct listen_socket_t;
using seconds32 = std::chrono::duration<std::int32_t>;
enum class waste_reason
{
piece_timed_out, piece_cancelled, piece_unknown, piece_seed
@ -136,7 +134,7 @@ namespace libtorrent
, web_seed_entry::headers_t const& extra_headers_ = web_seed_entry::headers_t());
// if this is > now, we can't reconnect yet
time_point retry = aux::time_now();
time_point32 retry = aux::time_now32();
// if the hostname of the web seed has been resolved,
// these are its IP addresses
@ -480,7 +478,7 @@ namespace libtorrent
void stop_when_ready(bool b);
time_point started() const { return m_started; }
time_point32 started() const { return m_started; }
void step_session_time(int seconds);
void do_pause(bool clear_disk_cache = true);
void do_resume();
@ -500,7 +498,7 @@ namespace libtorrent
// save resume data every 15 minutes regardless, just to
// keep stats up to date
return m_need_save_resume_data ||
aux::time_now() - m_last_saved_resume > minutes(15);
aux::time_now32() - m_last_saved_resume > minutes(15);
}
void set_need_save_resume()
@ -673,7 +671,7 @@ namespace libtorrent
, struct tracker_response const& resp) override;
virtual void tracker_request_error(tracker_request const& r
, int response_code, error_code const& ec, const std::string& msg
, int retry_interval) override;
, seconds32 retry_interval) override;
virtual void tracker_warning(tracker_request const& req
, std::string const& msg) override;
virtual void tracker_scrape_response(tracker_request const& req
@ -1038,7 +1036,7 @@ namespace libtorrent
// that are not private
void lsd_announce();
void update_last_upload() { m_last_upload = aux::time_now(); }
void update_last_upload() { m_last_upload = aux::time_now32(); }
void set_apply_ip_filter(bool b);
bool apply_ip_filter() const { return m_apply_ip_filter; }
@ -1138,7 +1136,7 @@ namespace libtorrent
void update_peer_interest(bool was_finished);
void prioritize_udp_trackers();
void update_tracker_timer(time_point now);
void update_tracker_timer(time_point32 now);
void on_tracker_announce(error_code const& ec);
@ -1287,7 +1285,7 @@ namespace libtorrent
// the posix time this torrent was added and when
// it was completed. If the torrent isn't yet
// completed, m_completed_time is 0
time_t m_added_time;
time_t m_added_time = time(nullptr);
time_t m_completed_time = 0;
// this was the last time _we_ saw a seed in this swarm
@ -1318,7 +1316,7 @@ namespace libtorrent
// m_num_verified = m_verified.count()
std::uint32_t m_num_verified = 0;
time_point m_last_saved_resume = aux::time_now();
time_point32 m_last_saved_resume = aux::time_now32();
// if this torrent is running, this was the time
// when it was started. This is used to have a
@ -1328,15 +1326,15 @@ namespace libtorrent
// in session-time. see session_impl for details.
// the reference point is stepped forward every 4
// hours to keep the timestamps fit in 16 bits
time_point m_started = aux::time_now();
time_point32 m_started = aux::time_now32();
// if we're a seed, this is the session time
// timestamp of when we became one
time_point m_became_seed = aux::time_now();
time_point32 m_became_seed = aux::time_now32();
// if we're finished, this is the session time
// timestamp of when we finished
time_point m_became_finished = aux::time_now();
time_point32 m_became_finished = aux::time_now32();
// when checking, this is the first piece we have not
// issued a hash job for
@ -1385,7 +1383,7 @@ namespace libtorrent
// the session time timestamp of when we entered upload mode
// if we're currently in upload-mode
time_point m_upload_mode_time = aux::time_now();
time_point32 m_upload_mode_time = aux::time_now32();
// true when this torrent should announce to
// trackers
@ -1427,7 +1425,7 @@ namespace libtorrent
// paused. specified in seconds. This only track time _before_ we started
// the torrent this last time. When the torrent is paused, this counter is
// incremented to include this current session.
seconds32 m_active_time;
seconds32 m_active_time{0};
// the index to the last tracker that worked
std::int8_t m_last_working_tracker = -1;
@ -1436,7 +1434,7 @@ namespace libtorrent
// total time we've been finished with this torrent.
// does not count when the torrent is stopped or paused.
seconds32 m_finished_time;
seconds32 m_finished_time{0};
// in case the piece picker hasn't been constructed
// when this settings is set, this variable will keep
@ -1476,7 +1474,7 @@ namespace libtorrent
// accounts for the time prior to the current start of the torrent. When
// the torrent is paused, this counter is incremented to account for the
// additional seeding time.
seconds32 m_seeding_time;
seconds32 m_seeding_time{0};
// ----
@ -1564,7 +1562,7 @@ namespace libtorrent
// the timestamp of the last piece passed for this torrent specified in
// session_time. This is signed because it must be able to represent time
// before the session started
time_point m_last_download = aux::time_now();
time_point32 m_last_download = aux::time_now32();
// the number of peer connections to seeds. This should be the same as
// counting the peer connections that say true for is_seed()
@ -1577,7 +1575,7 @@ namespace libtorrent
// the timestamp of the last byte uploaded from this torrent specified in
// session_time. This is signed because it must be able to represent time
// before the session started.
time_point m_last_upload = aux::time_now();
time_point32 m_last_upload = aux::time_now32();
// ----

View File

@ -197,10 +197,10 @@ namespace libtorrent
std::string warning_message;
// re-announce interval, in seconds
int interval;
seconds32 interval;
// the lowest force-announce interval
int min_interval;
seconds32 min_interval;
// the number of seeds in the swarm
int complete;
@ -236,7 +236,7 @@ namespace libtorrent
, int response_code
, error_code const& ec
, const std::string& msg
, int retry_interval) = 0;
, seconds32 retry_interval) = 0;
#ifndef TORRENT_DISABLE_LOGGING
virtual bool should_log() const = 0;
@ -298,7 +298,7 @@ namespace libtorrent
tracker_request const& tracker_req() const { return m_req; }
void fail(error_code const& ec, int code = -1, char const* msg = ""
, int interval = 0, int min_interval = 0);
, seconds32 interval = seconds32(0), seconds32 min_interval = seconds32(0));
virtual void start() = 0;
virtual void close() = 0;
address const& bind_interface() const { return m_req.bind_ip; }
@ -318,7 +318,7 @@ namespace libtorrent
protected:
void fail_impl(error_code const& ec, int code = -1, std::string msg = std::string()
, int interval = 0, int min_interval = 0);
, seconds32 interval = seconds32(0), seconds32 min_interval = seconds32(0));
std::weak_ptr<request_callback> m_requester;

View File

@ -95,7 +95,9 @@ namespace libtorrent
// wraps tracker_connection::fail
void fail(error_code const& ec, int code = -1
, char const* msg = "", int interval = 0, int min_interval = 0);
, char const* msg = ""
, seconds32 interval = seconds32(0)
, seconds32 min_interval = seconds32(0));
void send_udp_connect();
void send_udp_announce();

View File

@ -40,10 +40,21 @@ using namespace libtorrent;
using namespace sim;
namespace lt = libtorrent;
time_point32 time_now()
{
return lt::time_point_cast<seconds32>(lt::clock_type::now());
}
template <typename Tp1, typename Tp2>
bool eq(Tp1 const lhs, Tp2 const rhs)
{
return std::abs(lt::duration_cast<seconds>(lhs - rhs).count()) <= 1;
}
// this is a test for torrent_status time counters are correct
TORRENT_TEST(status_timers)
{
lt::time_point start_time;
lt::time_point32 start_time;
lt::torrent_handle handle;
bool ran_to_completion = false;
@ -57,7 +68,7 @@ TORRENT_TEST(status_timers)
if (auto ta = alert_cast<torrent_added_alert>(a))
{
TEST_CHECK(!handle.is_valid());
start_time = lt::clock_type::now();
start_time = time_now();
handle = ta->handle;
}
}
@ -78,7 +89,7 @@ TORRENT_TEST(status_timers)
// once an hour, verify that the timers seem correct
if ((ticks % 3600) == 0)
{
lt::time_point const now = lt::clock_type::now();
lt::time_point32 const now = time_now();
// finish is 1 tick after start
auto const since_finish = duration_cast<seconds>(now - start_time) - lt::seconds(1);
torrent_status st = handle.status();
@ -100,7 +111,7 @@ TORRENT_TEST(status_timers_last_upload)
{
bool ran_to_completion = false;
lt::time_point start_time;
lt::time_point32 start_time;
lt::torrent_handle handle;
setup_swarm(2, swarm_test::upload
@ -113,7 +124,7 @@ TORRENT_TEST(status_timers_last_upload)
if (auto ta = alert_cast<torrent_added_alert>(a))
{
TEST_CHECK(!handle.is_valid());
start_time = lt::clock_type::now();
start_time = time_now();
handle = ta->handle;
torrent_status st = handle.status();
// test last upload and download state before wo go throgh
@ -133,9 +144,9 @@ TORRENT_TEST(status_timers_last_upload)
torrent_status st = handle.status();
// uploadtime is 0 seconds behind now
TEST_EQUAL(duration_cast<seconds>(st.last_upload - lt::clock_type::now()).count(), 0);
TEST_CHECK(eq(st.last_upload, time_now()));
// does not download in seeding mode
TEST_CHECK(st.last_download == start_time);
TEST_CHECK(eq(st.last_download, start_time));
return false;
});
TEST_CHECK(ran_to_completion);
@ -145,9 +156,9 @@ TORRENT_TEST(status_timers_time_shift_with_active_torrent)
{
bool ran_to_completion = false;
lt::time_point start_time;
lt::time_point32 start_time;
lt::torrent_handle handle;
seconds expected_active_duration = seconds(0);
seconds expected_active_duration = seconds(1);
bool tick_is_in_active_range = false;
int tick_check_intervall = 1;
@ -161,7 +172,7 @@ TORRENT_TEST(status_timers_time_shift_with_active_torrent)
if (auto ta = alert_cast<torrent_added_alert>(a))
{
TEST_CHECK(!handle.is_valid());
start_time = lt::clock_type::now();
start_time = time_now();
handle = ta->handle;
torrent_status st = handle.status();
// test last upload and download state before wo go throgh
@ -227,9 +238,9 @@ TORRENT_TEST(finish_time_shift_active)
{
bool ran_to_completion = false;
lt::time_point start_time;
lt::time_point32 start_time;
lt::torrent_handle handle;
seconds expected_active_duration = seconds(0);
seconds expected_active_duration = seconds(1);
bool tick_is_in_active_range = false;
setup_swarm(1, swarm_test::upload
@ -242,7 +253,7 @@ TORRENT_TEST(finish_time_shift_active)
if (auto ta = alert_cast<torrent_added_alert>(a))
{
TEST_CHECK(!handle.is_valid());
start_time = lt::clock_type::now();
start_time = time_now();
handle = ta->handle;
torrent_status st = handle.status();
// test last upload and download state before wo go throgh
@ -301,9 +312,9 @@ TORRENT_TEST(finish_time_shift_paused)
{
bool ran_to_completion = false;
lt::time_point start_time;
lt::time_point32 start_time;
lt::torrent_handle handle;
seconds expected_active_duration = seconds(0);
seconds expected_active_duration = seconds(1);
bool tick_is_in_active_range = false;
setup_swarm(1, swarm_test::upload
@ -316,13 +327,13 @@ TORRENT_TEST(finish_time_shift_paused)
if (auto ta = alert_cast<torrent_added_alert>(a))
{
TEST_CHECK(!handle.is_valid());
start_time = lt::clock_type::now();
start_time = time_now();
handle = ta->handle;
torrent_status st = handle.status();
// test last upload and download state before wo go throgh
// torrent states
TEST_CHECK(st.last_download == start_time);
TEST_CHECK(st.last_upload == start_time);
TEST_CHECK(eq(st.last_download, start_time));
TEST_CHECK(eq(st.last_upload, start_time));
}
}
// terminate

View File

@ -52,6 +52,12 @@ using chrono::duration_cast;
// seconds
const int duration = 10000;
template <typename Tp1, typename Tp2>
bool eq(Tp1 const lhs, Tp2 const rhs)
{
return std::abs(lt::duration_cast<seconds>(lhs - rhs).count()) <= 1;
}
void test_interval(int interval)
{
using sim::asio::ip::address_v4;
@ -121,14 +127,13 @@ void test_interval(int interval)
lt::time_point last_alert = announce_alerts[0];
for (int i = 1; i < int(announces.size()); ++i)
{
// make sure the interval is within 500 ms of what it's supposed to be
// (this accounts for network latencies)
std::int64_t const actual_interval_ms = duration_cast<lt::milliseconds>(announces[i] - last_announce).count();
TEST_CHECK(std::abs(actual_interval_ms - interval * 1000) < 500);
// make sure the interval is within 1 second of what it's supposed to be
// (this accounts for network latencies, and the second-granularity
// timestamps)
TEST_CHECK(eq(duration_cast<lt::seconds>(announces[i] - last_announce), lt::seconds(interval)));
last_announce = announces[i];
std::int64_t const alert_interval_ms = duration_cast<lt::milliseconds>(announce_alerts[i] - last_alert).count();
TEST_CHECK(std::abs(alert_interval_ms - interval * 1000) < 500);
TEST_CHECK(eq(duration_cast<lt::milliseconds>(announce_alerts[i] - last_alert), lt::seconds(interval)));
last_alert = announce_alerts[i];
}
}

View File

@ -38,14 +38,13 @@ POSSIBILITY OF SUCH DAMAGE.
namespace libtorrent
{
enum
{
namespace {
// 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
};
seconds32 constexpr tracker_retry_delay_min{5};
// never wait more than 60 minutes to retry a tracker
minutes32 constexpr tracker_retry_delay_max{60};
}
announce_entry::announce_entry(std::string u)
: url(std::move(u))
@ -81,21 +80,23 @@ namespace libtorrent
void announce_entry::reset()
{
start_sent = false;
next_announce = min_time();
min_announce = min_time();
next_announce = time_point32::min();
min_announce = time_point32::min();
}
void announce_entry::failed(time_duration const tracker_backoff, int const retry_interval)
void announce_entry::failed(int const backoff_ratio, seconds32 const retry_interval)
{
++fails;
// the exponential back-off ends up being:
// 7, 15, 27, 45, 95, 127, 165, ... seconds
// with the default tracker_backoff of 250
int const tracker_backoff_seconds = int(total_seconds(tracker_backoff));
int const delay = std::max(std::min(tracker_retry_delay_min + int(fails) * int(fails)
* tracker_retry_delay_min * tracker_backoff_seconds / 100
, int(tracker_retry_delay_max)), retry_interval);
next_announce = aux::time_now() + seconds(delay);
int const fail_square = int(fails) * int(fails);
seconds32 const delay = std::max(retry_interval
, std::min(duration_cast<seconds32>(tracker_retry_delay_max)
, tracker_retry_delay_min
+ fail_square * tracker_retry_delay_min * backoff_ratio / 100
));
next_announce = aux::time_now32() + delay;
updating = false;
}

View File

@ -161,7 +161,7 @@ namespace libtorrent
{
if (tracker_req().i2pconn->local_endpoint().empty())
{
fail(errors::no_i2p_endpoint, -1, "Waiting for i2p acceptor from SAM bridge", 5);
fail(errors::no_i2p_endpoint, -1, "Waiting for i2p acceptor from SAM bridge", seconds32(5));
return;
}
else
@ -427,10 +427,9 @@ namespace libtorrent
return resp;
}
int interval = int(e.dict_find_int_value("interval", 0));
// if no interval is specified, default to 30 minutes
if (interval == 0) interval = 1800;
int min_interval = int(e.dict_find_int_value("min interval", 30));
seconds32 interval(e.dict_find_int_value("interval", 1800));
seconds32 const min_interval(e.dict_find_int_value("min interval", 30));
resp.interval = interval;
resp.min_interval = min_interval;

View File

@ -6923,7 +6923,7 @@ namespace aux {
"external ip: %s\n"
"we connected to: %s\n"
"peers:"
, resp.interval
, resp.interval.count()
, print_address(resp.external_ip).c_str()
, print_address(tracker_ip).c_str());
@ -6946,7 +6946,7 @@ namespace aux {
void tracker_logger::tracker_request_error(tracker_request const&
, int response_code, error_code const& ec, const std::string& str
, int retry_interval)
, seconds32 const retry_interval)
{
TORRENT_UNUSED(retry_interval);
debug_log("*** tracker error: %d: %s %s"

View File

@ -42,6 +42,7 @@ namespace libtorrent { namespace aux
std::atomic<time_point> g_current_time(clock_type::now());
}
time_point time_now() { return aux::g_current_time.load(); }
time_point32 time_now32() { return time_point_cast<seconds32>(clock_type::now()); }
void update_time_now() { g_current_time.store(clock_type::now()); }
} }

View File

@ -180,10 +180,7 @@ namespace libtorrent
#endif
, m_stats_counters(ses.stats_counters())
, m_storage_constructor(p.storage)
, m_added_time(time(nullptr))
, m_info_hash(info_hash)
, m_last_saved_resume(aux::time_now())
, m_started(aux::time_now())
, m_error_file(torrent_status::error_file_none)
, m_sequence_number(seq)
, m_announce_to_trackers((p.flags & add_torrent_params::flag_paused) == 0)
@ -193,15 +190,12 @@ namespace libtorrent
, m_storage_mode(p.storage_mode)
, m_announcing(false)
, m_added(false)
, m_active_time(0)
, m_finished_time(0)
, m_sequential_download(false)
, m_auto_sequential(false)
, m_seed_mode(false)
, m_super_seeding(false)
, m_stop_when_ready((p.flags & add_torrent_params::flag_stop_when_ready) != 0)
, m_need_save_resume_data((p.flags & add_torrent_params::flag_need_save_resume) != 0)
, m_seeding_time(0)
, m_max_uploads((1<<24)-1)
, m_num_uploads(0)
, m_need_connect_boost(true)
@ -963,7 +957,7 @@ namespace libtorrent
p->cancel_all_requests();
}
// this is used to try leaving upload only mode periodically
m_upload_mode_time = aux::time_now();
m_upload_mode_time = aux::time_now32();
}
else if (m_peer_list)
{
@ -1496,7 +1490,7 @@ namespace libtorrent
// this is needed for openssl < 1.0 to decrypt keys created by openssl 1.0+
OpenSSL_add_all_algorithms();
std::uint64_t now = clock_type::now().time_since_epoch().count();
std::uint64_t const now = clock_type::now().time_since_epoch().count();
// assume 9 bits of entropy (i.e. about 1 millisecond)
RAND_add(&now, 8, 1.125);
RAND_add(&info_hash()[0], 20, 3);
@ -2550,7 +2544,7 @@ namespace libtorrent
#ifndef TORRENT_DISABLE_LOGGING
debug_log("START DHT announce");
m_dht_start_time = clock_type::now();
m_dht_start_time = aux::time_now();
#endif
// if we're a seed, we tell the DHT for better scrape stats
@ -2690,7 +2684,7 @@ namespace libtorrent
req.num_want = (req.event == tracker_request::stopped)
? 0 : settings().get_int(settings_pack::num_want);
time_point const now = clock_type::now();
time_point32 const now = aux::time_now32();
// the tier is kept as INT_MAX until we find the first
// tracker that works, then it's set to that tracker's
@ -2760,7 +2754,7 @@ namespace libtorrent
if ((protocol == "http" || protocol == "https")
&& proxy_type == settings_pack::none)
{
ae.next_announce = now + minutes(10);
ae.next_announce = now + minutes32(10);
if (m_ses.alerts().should_post<anonymous_mode_alert>()
|| req.triggered_manually)
{
@ -2778,7 +2772,7 @@ namespace libtorrent
&& proxy_type != settings_pack::socks5_pw
&& proxy_type != settings_pack::i2p_proxy)
{
ae.next_announce = now + minutes(10);
ae.next_announce = now + minutes32(10);
if (m_ses.alerts().should_post<anonymous_mode_alert>()
|| req.triggered_manually)
{
@ -2822,8 +2816,8 @@ namespace libtorrent
}
ae.updating = true;
ae.next_announce = now + seconds(20);
ae.min_announce = now + seconds(10);
ae.next_announce = now + seconds32(20);
ae.min_announce = now + seconds32(10);
if (m_ses.alerts().should_post<tracker_announce_alert>())
{
@ -2965,11 +2959,10 @@ namespace libtorrent
m_ses.set_external_address(resp.external_ip
, aux::session_interface::source_tracker, tracker_ip);
time_point now = aux::time_now();
time_point32 now = aux::time_now32();
int interval = resp.interval;
if (interval < settings().get_int(settings_pack::min_announce_interval))
interval = settings().get_int(settings_pack::min_announce_interval);
auto interval = std::max(resp.interval, seconds32(
settings().get_int(settings_pack::min_announce_interval)));
announce_entry* ae = find_tracker(r.url);
if (ae)
@ -2984,8 +2977,8 @@ namespace libtorrent
ae->verified = true;
ae->updating = false;
ae->fails = 0;
ae->next_announce = now + seconds(interval);
ae->min_announce = now + seconds(resp.min_interval);
ae->next_announce = now + interval;
ae->min_announce = now + resp.min_interval;
int tracker_index = int(ae - &m_trackers[0]);
m_last_working_tracker = std::int8_t(prioritize_tracker(tracker_index));
@ -3022,7 +3015,7 @@ namespace libtorrent
"resolved to: %s\n"
"we connected to: %s\n"
"peers:"
, interval
, interval.count()
, print_address(resp.external_ip).c_str()
, resolved_to.c_str()
, print_address(tracker_ip).c_str());
@ -3283,7 +3276,8 @@ namespace libtorrent
{
for (auto& e : m_trackers)
{
e.next_announce = std::max(t, e.min_announce) + seconds(1);
e.next_announce = std::max(time_point_cast<seconds32>(t)
, e.min_announce) + seconds(1);
e.triggered_manually = true;
}
}
@ -3292,10 +3286,11 @@ namespace libtorrent
if (tracker_idx < 0 || tracker_idx >= int(m_trackers.size()))
return;
announce_entry& e = m_trackers[tracker_idx];
e.next_announce = std::max(t, e.min_announce) + seconds(1);
e.next_announce = std::max(time_point_cast<seconds32>(t)
, e.min_announce) + seconds32(1);
e.triggered_manually = true;
}
update_tracker_timer(clock_type::now());
update_tracker_timer(aux::time_now32());
}
#ifndef TORRENT_NO_DEPRECATE
@ -3851,7 +3846,7 @@ namespace libtorrent
// is deallocated by the torrent once it starts seeding
}
m_last_download = aux::time_now();
m_last_download = aux::time_now32();
if (m_share_mode)
recalc_share_mode();
@ -5735,7 +5730,7 @@ namespace libtorrent
#endif
// unavailable, retry in 30 minutes
web->retry = aux::time_now() + minutes(30);
web->retry = aux::time_now32() + minutes32(30);
return;
}
@ -7245,7 +7240,7 @@ namespace libtorrent
set_state(torrent_status::finished);
set_queue_position(-1);
m_became_finished = aux::time_now();
m_became_finished = aux::time_now32();
// we have to call completed() before we start
// disconnecting peers, since there's an assert
@ -7362,11 +7357,11 @@ namespace libtorrent
maybe_done_flushing();
set_state(torrent_status::seeding);
m_became_seed = aux::time_now();
m_became_seed = aux::time_now32();
if (!m_announcing) return;
time_point now = aux::time_now();
time_point32 const now = aux::time_now32();
for (std::vector<announce_entry>::iterator i = m_trackers.begin()
, end(m_trackers.end()); i != end; ++i)
{
@ -8346,7 +8341,7 @@ namespace libtorrent
}
m_need_save_resume_data = false;
m_last_saved_resume = aux::time_now();
m_last_saved_resume = aux::time_now32();
m_save_resume_flags = std::uint8_t(flags);
state_updated();
@ -8678,7 +8673,7 @@ namespace libtorrent
if (alerts().should_post<torrent_resumed_alert>())
alerts().emplace_alert<torrent_resumed_alert>(get_handle());
m_started = aux::time_now();
m_started = aux::time_now32();
if (is_seed()) m_became_seed = m_started;
if (is_finished()) m_became_finished = m_started;
@ -8705,7 +8700,7 @@ namespace libtorrent
do_connect_boost();
}
void torrent::update_tracker_timer(time_point const now)
void torrent::update_tracker_timer(time_point32 const now)
{
TORRENT_ASSERT(is_single_thread());
if (!m_announcing)
@ -8716,7 +8711,7 @@ namespace libtorrent
return;
}
time_point next_announce = max_time();
time_point32 next_announce = time_point32::max();
int tier = INT_MAX;
bool found_working = false;
@ -8751,7 +8746,7 @@ namespace libtorrent
}
else
{
time_point next_tracker_announce = (std::max)(t.next_announce, t.min_announce);
time_point32 next_tracker_announce = std::max(t.next_announce, t.min_announce);
if (next_tracker_announce < next_announce
&& (!found_working || t.is_working()))
next_announce = next_tracker_announce;
@ -8858,7 +8853,7 @@ namespace libtorrent
m_announcing = false;
time_point now = aux::time_now();
time_point32 const now = aux::time_now32();
for (auto& t : m_trackers)
{
t.next_announce = now;
@ -8904,8 +8899,7 @@ namespace libtorrent
if(!m_upload_mode)
return seconds32(0);
return duration_cast<seconds32>(
aux::time_now() - m_upload_mode_time);
return aux::time_now32() - m_upload_mode_time;
}
void torrent::second_tick(int tick_interval_ms)
@ -9890,7 +9884,7 @@ namespace libtorrent
if (i == m_web_seeds.end()) return;
if (i->removed) return;
if (retry == 0) retry = settings().get_int(settings_pack::urlseed_wait_retry);
i->retry = aux::time_now() + seconds(retry);
i->retry = aux::time_now32() + seconds32(retry);
}
torrent_state torrent::get_peer_list_state()
@ -10497,7 +10491,7 @@ namespace libtorrent
{
INVARIANT_CHECK;
time_point now = aux::time_now();
time_point32 const now = aux::time_now32();
st->handle = get_handle();
st->info_hash = info_hash();
@ -10793,7 +10787,7 @@ namespace libtorrent
void torrent::tracker_request_error(tracker_request const& r
, int response_code, error_code const& ec, std::string const& msg
, int retry_interval)
, seconds32 const retry_interval)
{
TORRENT_ASSERT(is_single_thread());
@ -10812,7 +10806,7 @@ namespace libtorrent
announce_entry* ae = find_tracker(r.url);
if (ae)
{
ae->failed(seconds(settings().get_int(settings_pack::tracker_backoff))
ae->failed(settings().get_int(settings_pack::tracker_backoff)
, retry_interval);
ae->last_error = ec;
ae->message = msg;
@ -10854,7 +10848,7 @@ namespace libtorrent
// announce to the next working tracker
if ((!m_abort && !is_paused()) || r.event == tracker_request::stopped)
announce_with_tracker(r.event);
update_tracker_timer(aux::time_now());
update_tracker_timer(aux::time_now32());
}
#ifndef TORRENT_DISABLE_LOGGING

View File

@ -155,7 +155,7 @@ namespace libtorrent
}
void tracker_connection::fail(error_code const& ec, int code
, char const* msg, int interval, int min_interval)
, char const* msg, seconds32 const interval, seconds32 const min_interval)
{
// we need to post the error to avoid deadlock
get_io_service().post(std::bind(&tracker_connection::fail_impl
@ -163,11 +163,11 @@ namespace libtorrent
}
void tracker_connection::fail_impl(error_code const& ec, int code
, std::string msg, int interval, int min_interval)
, std::string msg, seconds32 const interval, seconds32 const min_interval)
{
std::shared_ptr<request_callback> cb = requester();
if (cb) cb->tracker_request_error(m_req, code, ec, msg.c_str()
, interval == 0 ? min_interval : interval);
, interval.count() == 0 ? min_interval : interval);
close();
}
@ -284,7 +284,7 @@ namespace libtorrent
if (std::shared_ptr<request_callback> r = c.lock())
ios.post(std::bind(&request_callback::tracker_request_error, r, req
, -1, error_code(errors::unsupported_url_protocol)
, "", 0));
, "", seconds32(0)));
}
bool tracker_manager::incoming_packet(udp::endpoint const& ep

View File

@ -128,7 +128,7 @@ namespace libtorrent
}
void udp_tracker_connection::fail(error_code const& ec, int code
, char const* msg, int interval, int min_interval)
, char const* msg, seconds32 const interval, seconds32 const min_interval)
{
// m_target failed. remove it from the endpoint list
auto const i = std::find(m_endpoints.begin()
@ -593,8 +593,8 @@ namespace libtorrent
tracker_response resp;
resp.interval = aux::read_int32(buf);
resp.min_interval = 60;
resp.interval = seconds32(aux::read_int32(buf));
resp.min_interval = seconds32(60);
resp.incomplete = aux::read_int32(buf);
resp.complete = aux::read_int32(buf);
int const num_peers = int(buf.size()) / 6;

View File

@ -51,10 +51,10 @@ TORRENT_TEST(primitives)
// on failing announces
announce_entry ae("dummy");
int last = 0;
auto const tracker_backoff = seconds(250);
auto const tracker_backoff = 250;
for (int i = 0; i < 10; ++i)
{
ae.failed(tracker_backoff, 5);
ae.failed(tracker_backoff, seconds32(5));
#ifndef TORRENT_NO_DEPRECATE
int const delay = ae.next_announce_in();
#else

View File

@ -183,8 +183,8 @@ TORRENT_TEST(parse_interval)
TEST_EQUAL(ec, error_code());
TEST_EQUAL(resp.peers.size(), 0);
TEST_EQUAL(resp.peers4.size(), 0);
TEST_EQUAL(resp.interval, 1042);
TEST_EQUAL(resp.min_interval, 10);
TEST_EQUAL(resp.interval.count(), 1042);
TEST_EQUAL(resp.min_interval.count(), 10);
}
TORRENT_TEST(parse_warning)