Ignore measurements around leap second
When current time is within 5 seconds of a leap second, don't accumulate new samples or update the leap second status to increase the chances of getting through safely.
This commit is contained in:
parent
e1accce498
commit
0e786f5907
3 changed files with 35 additions and 1 deletions
27
reference.c
27
reference.c
|
@ -680,7 +680,7 @@ update_leap_status(NTP_Leap leap, time_t now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (leap_sec != our_leap_sec) {
|
if (leap_sec != our_leap_sec && !REF_IsLeapSecondClose()) {
|
||||||
LCL_SetLeap(leap_sec);
|
LCL_SetLeap(leap_sec);
|
||||||
our_leap_sec = leap_sec;
|
our_leap_sec = leap_sec;
|
||||||
}
|
}
|
||||||
|
@ -1150,6 +1150,31 @@ REF_IsLocalActive(void)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
#define LEAP_SECOND_CLOSE 5
|
||||||
|
|
||||||
|
int REF_IsLeapSecondClose(void)
|
||||||
|
{
|
||||||
|
struct timeval now, now_raw;
|
||||||
|
time_t t;
|
||||||
|
|
||||||
|
if (!our_leap_sec)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
SCH_GetLastEventTime(&now, NULL, &now_raw);
|
||||||
|
|
||||||
|
t = now.tv_sec > 0 ? now.tv_sec : -now.tv_sec;
|
||||||
|
if ((t + LEAP_SECOND_CLOSE) % (24 * 3600) < 2 * LEAP_SECOND_CLOSE)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
t = now_raw.tv_sec > 0 ? now_raw.tv_sec : -now_raw.tv_sec;
|
||||||
|
if ((t + LEAP_SECOND_CLOSE) % (24 * 3600) < 2 * LEAP_SECOND_CLOSE)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
void
|
void
|
||||||
REF_GetTrackingReport(RPT_TrackingReport *rep)
|
REF_GetTrackingReport(RPT_TrackingReport *rep)
|
||||||
{
|
{
|
||||||
|
|
|
@ -161,6 +161,10 @@ extern void REF_EnableLocal(int stratum);
|
||||||
extern void REF_DisableLocal(void);
|
extern void REF_DisableLocal(void);
|
||||||
extern int REF_IsLocalActive(void);
|
extern int REF_IsLocalActive(void);
|
||||||
|
|
||||||
|
/* Check if current raw or cooked time is close to a leap second
|
||||||
|
and is better to discard any measurements */
|
||||||
|
extern int REF_IsLeapSecondClose(void);
|
||||||
|
|
||||||
extern void REF_GetTrackingReport(RPT_TrackingReport *rep);
|
extern void REF_GetTrackingReport(RPT_TrackingReport *rep);
|
||||||
|
|
||||||
#endif /* GOT_REFERENCE_H */
|
#endif /* GOT_REFERENCE_H */
|
||||||
|
|
|
@ -312,6 +312,11 @@ void SRC_AccumulateSample
|
||||||
DEBUG_LOG(LOGF_Sources, "ip=[%s] t=%s ofs=%f del=%f disp=%f str=%d",
|
DEBUG_LOG(LOGF_Sources, "ip=[%s] t=%s ofs=%f del=%f disp=%f str=%d",
|
||||||
source_to_string(inst), UTI_TimevalToString(sample_time), -offset, root_delay, root_dispersion, stratum);
|
source_to_string(inst), UTI_TimevalToString(sample_time), -offset, root_delay, root_dispersion, stratum);
|
||||||
|
|
||||||
|
if (REF_IsLeapSecondClose()) {
|
||||||
|
LOG(LOGS_INFO, LOGF_Sources, "Dropping sample around leap second");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* WE HAVE TO NEGATE OFFSET IN THIS CALL, IT IS HERE THAT THE SENSE OF OFFSET
|
/* WE HAVE TO NEGATE OFFSET IN THIS CALL, IT IS HERE THAT THE SENSE OF OFFSET
|
||||||
IS FLIPPED */
|
IS FLIPPED */
|
||||||
SST_AccumulateSample(inst->stats, sample_time, -offset, peer_delay, peer_dispersion, root_delay, root_dispersion, stratum);
|
SST_AccumulateSample(inst->stats, sample_time, -offset, peer_delay, peer_dispersion, root_delay, root_dispersion, stratum);
|
||||||
|
|
Loading…
Reference in a new issue