Retry NTP requests more frequently if we don't receive a (valid) reply
This commit is contained in:
parent
0d61966a1c
commit
82dd74add0
1 changed files with 13 additions and 4 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue