Re: [chrony-dev] Patch for adding leap seconds in the PPS refclock |
[ Thread Index |
Date Index
| More chrony.tuxfamily.org/chrony-dev Archives
]
On Thu, May 22, 2014 at 09:00:33AM +0200, Hattink, Tjalling [FINT] wrote:
> I've pasted a patch below that fixes leap second handling for the PPS
> refclock. Without the patch the PPS refclock will always report
> LEAP_normal. But if a locked refclock (the SHM clock in my case) does
> report a leap state it should also be taken over by the PPS refclock,
> otherwise chrony will still use LEAP_normal when the PPS clock is used
> as reference source.
Nice find. The patch looks good to me, but can you please send a
version against current git with "git send-email" so I can apply it
with "git am"? You get the credit and I don't mess up your commit
message. Thanks.
> The patch will copy the leap state from the refclock. In case the PPS
> clock is not specifically locked to another refclock it will take over
> the leap state from the local clock.
>
> I've tested this patch by simulating a leap second through the samples
> for the SHM clock, and with the patch you will see chrony properly jump
> forward or backward on the leap second. Without the patch it will not do
> this and the clock becomes desynchronized and no leap state is reported
> upstream to other NTP clients.
>
> Kind regards,
>
> Tjalling Hattink
>
>
> --- a/refclock.c
> +++ b/refclock.c
> @@ -378,7 +378,9 @@ RCL_AddPulse(RCL_Instance instance, stru
> double correction, dispersion, offset;
> struct timeval cooked_time;
> int rate;
> + NTP_Leap leap;
>
> + leap = LEAP_Normal;
> LCL_GetOffsetCorrection(pulse_time, &correction, &dispersion);
> UTI_AddDoubleToTimeval(pulse_time, correction, &cooked_time);
> dispersion += instance->precision +
> filter_get_avg_sample_dispersion(&instance->filter);
> @@ -421,6 +423,8 @@ RCL_AddPulse(RCL_Instance instance, stru
> if (fabs(ref_offset - offset) + ref_dispersion + dispersion >= 0.2
> / rate)
> return 0;
>
> + leap = refclocks[instance->lock_ref].leap_status;
> +
> #if 0
> LOG(LOGS_INFO, LOGF_Refclock, "refclock pulse second=%.9f
> offset=%.9f offdiff=%.9f samplediff=%.9f",
> second, offset, ref_offset - offset, sample_diff);
> @@ -429,7 +433,6 @@ RCL_AddPulse(RCL_Instance instance, stru
> struct timeval ref_time;
> int is_synchronised, stratum;
> double root_delay, root_dispersion, distance;
> - NTP_Leap leap;
> uint32_t ref_id;
>
> /* Ignore the pulse if we are not well synchronized */
> @@ -450,7 +453,7 @@ RCL_AddPulse(RCL_Instance instance, stru
> }
>
> filter_add_sample(&instance->filter, &cooked_time, offset,
> dispersion);
> - instance->leap_status = LEAP_Normal;
> + instance->leap_status = leap;
>
> log_sample(instance, &cooked_time, 0, 1, offset + correction -
> instance->offset, offset, dispersion);
>
--
Miroslav Lichvar
--
To unsubscribe email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "unsubscribe" in the subject.
For help email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "help" in the subject.
Trouble? Email listmaster@xxxxxxxxxxxxxxxxxxxx.