Retry NTP requests more frequently if we don't receive a (valid) reply

This commit is contained in:
Eric Frias 2014-10-07 11:10:27 -04:00
parent 0d61966a1c
commit 82dd74add0

View file

@ -23,6 +23,8 @@ namespace fc
fc::future<void> _read_loop_done; fc::future<void> _read_loop_done;
udp_socket _sock; udp_socket _sock;
uint32_t _request_interval_sec; uint32_t _request_interval_sec;
uint32_t _retry_failed_request_interval_sec;
fc::time_point _last_valid_ntp_reply_received_time;
std::atomic_bool _last_ntp_delta_initialized; std::atomic_bool _last_ntp_delta_initialized;
std::atomic<int64_t> _last_ntp_delta_microseconds; std::atomic<int64_t> _last_ntp_delta_microseconds;
@ -33,6 +35,7 @@ namespace fc
ntp_impl() : ntp_impl() :
_ntp_thread("ntp"), _ntp_thread("ntp"),
_request_interval_sec( 60*60 /* 1 hr */), _request_interval_sec( 60*60 /* 1 hr */),
_retry_failed_request_interval_sec(60 * 5),
_last_ntp_delta_microseconds(0) _last_ntp_delta_microseconds(0)
{ {
_last_ntp_delta_initialized = false; _last_ntp_delta_initialized = false;
@ -98,14 +101,18 @@ namespace fc
} }
} // request_now } // request_now
//started for first time in ntp() constructor, canceled in ~ntp() destructor // started for first time in ntp() constructor, canceled in ~ntp() destructor
// this task gets invoked every _retry_failed_request_interval_sec (currently 5 min), and if
// _request_interval_sec (currently 1 hour) has passed since the last successful update,
// it sends a new request
void request_time_task() void request_time_task()
{ {
assert(_ntp_thread.is_current()); assert(_ntp_thread.is_current());
request_now(); if (_last_valid_ntp_reply_received_time <= fc::time_point::now() - fc::seconds(_request_interval_sec - 5))
request_now();
if (!_request_time_task_done.canceled()) if (!_request_time_task_done.canceled())
_request_time_task_done = schedule( [=](){ request_time_task(); }, _request_time_task_done = schedule( [=](){ request_time_task(); },
fc::time_point::now() + fc::seconds(_request_interval_sec), fc::time_point::now() + fc::seconds(_retry_failed_request_interval_sec),
"request_time_task" ); "request_time_task" );
} // request_loop } // request_loop
@ -167,6 +174,7 @@ namespace fc
_last_ntp_delta_microseconds = offset.count(); _last_ntp_delta_microseconds = offset.count();
_last_ntp_delta_initialized = true; _last_ntp_delta_initialized = true;
fc::microseconds ntp_delta_time = fc::microseconds(_last_ntp_delta_microseconds); fc::microseconds ntp_delta_time = fc::microseconds(_last_ntp_delta_microseconds);
_last_valid_ntp_reply_received_time = receive_time;
wlog("ntp_delta_time updated to ${delta_time}", ("delta_time",ntp_delta_time) ); wlog("ntp_delta_time updated to ${delta_time}", ("delta_time",ntp_delta_time) );
} }
else else
@ -190,7 +198,7 @@ namespace fc
elog("unknown exception in read_loop, going to restart it."); elog("unknown exception in read_loop, going to restart it.");
} }
_sock.close(); _sock.close();
fc::usleep(fc::seconds(_request_interval_sec)); fc::usleep(fc::seconds(_retry_failed_request_interval_sec));
} //outer while loop } //outer while loop
wlog("exiting ntp read_loop"); wlog("exiting ntp read_loop");
} //end read_loop() } //end read_loop()
@ -247,6 +255,7 @@ namespace fc
void ntp::set_request_interval( uint32_t interval_sec ) void ntp::set_request_interval( uint32_t interval_sec )
{ {
my->_request_interval_sec = interval_sec; my->_request_interval_sec = interval_sec;
my->_retry_failed_request_interval_sec = std::min(my->_retry_failed_request_interval_sec, interval_sec);
} }
void ntp::request_now() void ntp::request_now()