From 0e786f59074b436a46e10bf72bfef325e92c5583 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 9 Sep 2014 16:57:15 +0200 Subject: [PATCH] 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. --- reference.c | 27 ++++++++++++++++++++++++++- reference.h | 4 ++++ sources.c | 5 +++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/reference.c b/reference.c index d77d82a..4b231a7 100644 --- a/reference.c +++ b/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); 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 REF_GetTrackingReport(RPT_TrackingReport *rep) { diff --git a/reference.h b/reference.h index 6fac8d5..fc91840 100644 --- a/reference.h +++ b/reference.h @@ -161,6 +161,10 @@ extern void REF_EnableLocal(int stratum); extern void REF_DisableLocal(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); #endif /* GOT_REFERENCE_H */ diff --git a/sources.c b/sources.c index e24463d..30a3abe 100644 --- a/sources.c +++ b/sources.c @@ -312,6 +312,11 @@ void SRC_AccumulateSample 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); + 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 IS FLIPPED */ SST_AccumulateSample(inst->stats, sample_time, -offset, peer_delay, peer_dispersion, root_delay, root_dispersion, stratum);